1 /****************************************************************************** 2 * 3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2015, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acdisasm.h" 47 #include "actables.h" 48 49 /* This module used for application-level code only */ 50 51 #define _COMPONENT ACPI_CA_DISASSEMBLER 52 ACPI_MODULE_NAME ("dmtbdump") 53 54 55 /* Local prototypes */ 56 57 static void 58 AcpiDmValidateFadtLength ( 59 UINT32 Revision, 60 UINT32 Length); 61 62 63 /******************************************************************************* 64 * 65 * FUNCTION: AcpiDmDumpBuffer 66 * 67 * PARAMETERS: Table - ACPI Table or subtable 68 * BufferOffset - Offset of buffer from Table above 69 * Length - Length of the buffer 70 * AbsoluteOffset - Offset of buffer in the main ACPI table 71 * Header - Name of the buffer field (printed on the 72 * first line only.) 73 * 74 * RETURN: None 75 * 76 * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the 77 * disassembler output format.) 78 * 79 ******************************************************************************/ 80 81 void 82 AcpiDmDumpBuffer ( 83 void *Table, 84 UINT32 BufferOffset, 85 UINT32 Length, 86 UINT32 AbsoluteOffset, 87 char *Header) 88 { 89 UINT8 *Buffer; 90 UINT32 i; 91 92 93 if (!Length) 94 { 95 return; 96 } 97 98 Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset; 99 i = 0; 100 101 while (i < Length) 102 { 103 if (!(i % 16)) 104 { 105 /* Insert a backslash - line continuation character */ 106 107 if (Length > 16) 108 { 109 AcpiOsPrintf ("\\\n "); 110 } 111 } 112 113 AcpiOsPrintf ("%.02X ", *Buffer); 114 i++; 115 Buffer++; 116 AbsoluteOffset++; 117 } 118 119 AcpiOsPrintf ("\n"); 120 } 121 122 123 /******************************************************************************* 124 * 125 * FUNCTION: AcpiDmDumpUnicode 126 * 127 * PARAMETERS: Table - ACPI Table or subtable 128 * BufferOffset - Offset of buffer from Table above 129 * ByteLength - Length of the buffer 130 * 131 * RETURN: None 132 * 133 * DESCRIPTION: Validate and dump the contents of a buffer that contains 134 * unicode data. The output is a standard ASCII string. If it 135 * appears that the data is not unicode, the buffer is dumped 136 * as hex characters. 137 * 138 ******************************************************************************/ 139 140 void 141 AcpiDmDumpUnicode ( 142 void *Table, 143 UINT32 BufferOffset, 144 UINT32 ByteLength) 145 { 146 UINT8 *Buffer; 147 UINT32 Length; 148 UINT32 i; 149 150 151 Buffer = ((UINT8 *) Table) + BufferOffset; 152 Length = ByteLength - 2; /* Last two bytes are the null terminator */ 153 154 /* Ensure all low bytes are entirely printable ASCII */ 155 156 for (i = 0; i < Length; i += 2) 157 { 158 if (!isprint (Buffer[i])) 159 { 160 goto DumpRawBuffer; 161 } 162 } 163 164 /* Ensure all high bytes are zero */ 165 166 for (i = 1; i < Length; i += 2) 167 { 168 if (Buffer[i]) 169 { 170 goto DumpRawBuffer; 171 } 172 } 173 174 /* Dump the buffer as a normal string */ 175 176 AcpiOsPrintf ("\""); 177 for (i = 0; i < Length; i += 2) 178 { 179 AcpiOsPrintf ("%c", Buffer[i]); 180 } 181 182 AcpiOsPrintf ("\"\n"); 183 return; 184 185 DumpRawBuffer: 186 AcpiDmDumpBuffer (Table, BufferOffset, ByteLength, 187 BufferOffset, NULL); 188 AcpiOsPrintf ("\n"); 189 } 190 191 192 /******************************************************************************* 193 * 194 * FUNCTION: AcpiDmDumpRsdp 195 * 196 * PARAMETERS: Table - A RSDP 197 * 198 * RETURN: Length of the table (there is not always a length field, 199 * use revision or length if available (ACPI 2.0+)) 200 * 201 * DESCRIPTION: Format the contents of a RSDP 202 * 203 ******************************************************************************/ 204 205 UINT32 206 AcpiDmDumpRsdp ( 207 ACPI_TABLE_HEADER *Table) 208 { 209 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 210 UINT32 Length = sizeof (ACPI_RSDP_COMMON); 211 UINT8 Checksum; 212 ACPI_STATUS Status; 213 214 215 /* Dump the common ACPI 1.0 portion */ 216 217 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 218 if (ACPI_FAILURE (Status)) 219 { 220 return (Length); 221 } 222 223 /* Validate the first checksum */ 224 225 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 226 Rsdp->Checksum); 227 if (Checksum != Rsdp->Checksum) 228 { 229 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 230 Checksum); 231 } 232 233 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 234 235 if (Rsdp->Revision > 0) 236 { 237 Length = Rsdp->Length; 238 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 239 if (ACPI_FAILURE (Status)) 240 { 241 return (Length); 242 } 243 244 /* Validate the extended checksum over entire RSDP */ 245 246 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 247 Rsdp->ExtendedChecksum); 248 if (Checksum != Rsdp->ExtendedChecksum) 249 { 250 AcpiOsPrintf ( 251 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 252 Checksum); 253 } 254 } 255 256 return (Length); 257 } 258 259 260 /******************************************************************************* 261 * 262 * FUNCTION: AcpiDmDumpRsdt 263 * 264 * PARAMETERS: Table - A RSDT 265 * 266 * RETURN: None 267 * 268 * DESCRIPTION: Format the contents of a RSDT 269 * 270 ******************************************************************************/ 271 272 void 273 AcpiDmDumpRsdt ( 274 ACPI_TABLE_HEADER *Table) 275 { 276 UINT32 *Array; 277 UINT32 Entries; 278 UINT32 Offset; 279 UINT32 i; 280 281 282 /* Point to start of table pointer array */ 283 284 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 285 Offset = sizeof (ACPI_TABLE_HEADER); 286 287 /* RSDT uses 32-bit pointers */ 288 289 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 290 291 for (i = 0; i < Entries; i++) 292 { 293 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 294 AcpiOsPrintf ("%8.8X\n", Array[i]); 295 Offset += sizeof (UINT32); 296 } 297 } 298 299 300 /******************************************************************************* 301 * 302 * FUNCTION: AcpiDmDumpXsdt 303 * 304 * PARAMETERS: Table - A XSDT 305 * 306 * RETURN: None 307 * 308 * DESCRIPTION: Format the contents of a XSDT 309 * 310 ******************************************************************************/ 311 312 void 313 AcpiDmDumpXsdt ( 314 ACPI_TABLE_HEADER *Table) 315 { 316 UINT64 *Array; 317 UINT32 Entries; 318 UINT32 Offset; 319 UINT32 i; 320 321 322 /* Point to start of table pointer array */ 323 324 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 325 Offset = sizeof (ACPI_TABLE_HEADER); 326 327 /* XSDT uses 64-bit pointers */ 328 329 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 330 331 for (i = 0; i < Entries; i++) 332 { 333 AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 334 AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 335 Offset += sizeof (UINT64); 336 } 337 } 338 339 340 /******************************************************************************* 341 * 342 * FUNCTION: AcpiDmDumpFadt 343 * 344 * PARAMETERS: Table - A FADT 345 * 346 * RETURN: None 347 * 348 * DESCRIPTION: Format the contents of a FADT 349 * 350 * NOTE: We cannot depend on the FADT version to indicate the actual 351 * contents of the FADT because of BIOS bugs. The table length 352 * is the only reliable indicator. 353 * 354 ******************************************************************************/ 355 356 void 357 AcpiDmDumpFadt ( 358 ACPI_TABLE_HEADER *Table) 359 { 360 ACPI_STATUS Status; 361 362 363 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 364 365 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 366 AcpiDmTableInfoFadt1); 367 if (ACPI_FAILURE (Status)) 368 { 369 return; 370 } 371 372 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 373 374 if ((Table->Length > ACPI_FADT_V1_SIZE) && 375 (Table->Length <= ACPI_FADT_V2_SIZE)) 376 { 377 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 378 AcpiDmTableInfoFadt2); 379 if (ACPI_FAILURE (Status)) 380 { 381 return; 382 } 383 } 384 385 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 386 387 else if (Table->Length > ACPI_FADT_V2_SIZE) 388 { 389 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 390 AcpiDmTableInfoFadt3); 391 if (ACPI_FAILURE (Status)) 392 { 393 return; 394 } 395 396 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 397 398 if (Table->Length > ACPI_FADT_V3_SIZE) 399 { 400 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 401 AcpiDmTableInfoFadt5); 402 if (ACPI_FAILURE (Status)) 403 { 404 return; 405 } 406 } 407 408 /* Check for FADT revision 6 fields and up (ACPI 6.0+) */ 409 410 if (Table->Length > ACPI_FADT_V3_SIZE) 411 { 412 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 413 AcpiDmTableInfoFadt6); 414 if (ACPI_FAILURE (Status)) 415 { 416 return; 417 } 418 } 419 } 420 421 /* Validate various fields in the FADT, including length */ 422 423 AcpiTbCreateLocalFadt (Table, Table->Length); 424 425 /* Validate FADT length against the revision */ 426 427 AcpiDmValidateFadtLength (Table->Revision, Table->Length); 428 } 429 430 431 /******************************************************************************* 432 * 433 * FUNCTION: AcpiDmValidateFadtLength 434 * 435 * PARAMETERS: Revision - FADT revision (Header->Revision) 436 * Length - FADT length (Header->Length 437 * 438 * RETURN: None 439 * 440 * DESCRIPTION: Check the FADT revision against the expected table length for 441 * that revision. Issue a warning if the length is not what was 442 * expected. This seems to be such a common BIOS bug that the 443 * FADT revision has been rendered virtually meaningless. 444 * 445 ******************************************************************************/ 446 447 static void 448 AcpiDmValidateFadtLength ( 449 UINT32 Revision, 450 UINT32 Length) 451 { 452 UINT32 ExpectedLength; 453 454 455 switch (Revision) 456 { 457 case 0: 458 459 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 460 return; 461 462 case 1: 463 464 ExpectedLength = ACPI_FADT_V1_SIZE; 465 break; 466 467 case 2: 468 469 ExpectedLength = ACPI_FADT_V2_SIZE; 470 break; 471 472 case 3: 473 case 4: 474 475 ExpectedLength = ACPI_FADT_V3_SIZE; 476 break; 477 478 case 5: 479 480 ExpectedLength = ACPI_FADT_V5_SIZE; 481 break; 482 483 default: 484 485 return; 486 } 487 488 if (Length == ExpectedLength) 489 { 490 return; 491 } 492 493 AcpiOsPrintf ( 494 "\n// ACPI Warning: FADT revision %X does not match length: " 495 "found %X expected %X\n", 496 Revision, Length, ExpectedLength); 497 } 498 499 500 /******************************************************************************* 501 * 502 * FUNCTION: AcpiDmDumpAsf 503 * 504 * PARAMETERS: Table - A ASF table 505 * 506 * RETURN: None 507 * 508 * DESCRIPTION: Format the contents of a ASF table 509 * 510 ******************************************************************************/ 511 512 void 513 AcpiDmDumpAsf ( 514 ACPI_TABLE_HEADER *Table) 515 { 516 ACPI_STATUS Status; 517 UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 518 ACPI_ASF_INFO *SubTable; 519 ACPI_DMTABLE_INFO *InfoTable; 520 ACPI_DMTABLE_INFO *DataInfoTable = NULL; 521 UINT8 *DataTable = NULL; 522 UINT32 DataCount = 0; 523 UINT32 DataLength = 0; 524 UINT32 DataOffset = 0; 525 UINT32 i; 526 UINT8 Type; 527 528 529 /* No main table, only subtables */ 530 531 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 532 while (Offset < Table->Length) 533 { 534 /* Common subtable header */ 535 536 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 537 SubTable->Header.Length, AcpiDmTableInfoAsfHdr); 538 if (ACPI_FAILURE (Status)) 539 { 540 return; 541 } 542 543 /* The actual type is the lower 7 bits of Type */ 544 545 Type = (UINT8) (SubTable->Header.Type & 0x7F); 546 547 switch (Type) 548 { 549 case ACPI_ASF_TYPE_INFO: 550 551 InfoTable = AcpiDmTableInfoAsf0; 552 break; 553 554 case ACPI_ASF_TYPE_ALERT: 555 556 InfoTable = AcpiDmTableInfoAsf1; 557 DataInfoTable = AcpiDmTableInfoAsf1a; 558 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); 559 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; 560 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; 561 DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 562 break; 563 564 case ACPI_ASF_TYPE_CONTROL: 565 566 InfoTable = AcpiDmTableInfoAsf2; 567 DataInfoTable = AcpiDmTableInfoAsf2a; 568 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); 569 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; 570 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; 571 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 572 break; 573 574 case ACPI_ASF_TYPE_BOOT: 575 576 InfoTable = AcpiDmTableInfoAsf3; 577 break; 578 579 case ACPI_ASF_TYPE_ADDRESS: 580 581 InfoTable = AcpiDmTableInfoAsf4; 582 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); 583 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; 584 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 585 break; 586 587 default: 588 589 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", 590 SubTable->Header.Type); 591 return; 592 } 593 594 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 595 SubTable->Header.Length, InfoTable); 596 if (ACPI_FAILURE (Status)) 597 { 598 return; 599 } 600 601 /* Dump variable-length extra data */ 602 603 switch (Type) 604 { 605 case ACPI_ASF_TYPE_ALERT: 606 case ACPI_ASF_TYPE_CONTROL: 607 608 for (i = 0; i < DataCount; i++) 609 { 610 AcpiOsPrintf ("\n"); 611 Status = AcpiDmDumpTable (Table->Length, DataOffset, 612 DataTable, DataLength, DataInfoTable); 613 if (ACPI_FAILURE (Status)) 614 { 615 return; 616 } 617 618 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 619 DataOffset += DataLength; 620 } 621 break; 622 623 case ACPI_ASF_TYPE_ADDRESS: 624 625 for (i = 0; i < DataLength; i++) 626 { 627 if (!(i % 16)) 628 { 629 AcpiDmLineHeader (DataOffset, 1, "Addresses"); 630 } 631 632 AcpiOsPrintf ("%2.2X ", *DataTable); 633 DataTable++; 634 DataOffset++; 635 636 if (DataOffset > Table->Length) 637 { 638 AcpiOsPrintf ( 639 "**** ACPI table terminates in the middle of a " 640 "data structure! (ASF! table)\n"); 641 return; 642 } 643 } 644 645 AcpiOsPrintf ("\n"); 646 break; 647 648 default: 649 650 break; 651 } 652 653 AcpiOsPrintf ("\n"); 654 655 /* Point to next subtable */ 656 657 if (!SubTable->Header.Length) 658 { 659 AcpiOsPrintf ("Invalid zero subtable header length\n"); 660 return; 661 } 662 663 Offset += SubTable->Header.Length; 664 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, 665 SubTable->Header.Length); 666 } 667 } 668 669 670 /******************************************************************************* 671 * 672 * FUNCTION: AcpiDmDumpCpep 673 * 674 * PARAMETERS: Table - A CPEP table 675 * 676 * RETURN: None 677 * 678 * DESCRIPTION: Format the contents of a CPEP. This table type consists 679 * of an open-ended number of subtables. 680 * 681 ******************************************************************************/ 682 683 void 684 AcpiDmDumpCpep ( 685 ACPI_TABLE_HEADER *Table) 686 { 687 ACPI_STATUS Status; 688 ACPI_CPEP_POLLING *SubTable; 689 UINT32 Length = Table->Length; 690 UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 691 692 693 /* Main table */ 694 695 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 696 if (ACPI_FAILURE (Status)) 697 { 698 return; 699 } 700 701 /* Subtables */ 702 703 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 704 while (Offset < Table->Length) 705 { 706 AcpiOsPrintf ("\n"); 707 Status = AcpiDmDumpTable (Length, Offset, SubTable, 708 SubTable->Header.Length, AcpiDmTableInfoCpep0); 709 if (ACPI_FAILURE (Status)) 710 { 711 return; 712 } 713 714 /* Point to next subtable */ 715 716 Offset += SubTable->Header.Length; 717 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, 718 SubTable->Header.Length); 719 } 720 } 721 722 723 /******************************************************************************* 724 * 725 * FUNCTION: AcpiDmDumpCsrt 726 * 727 * PARAMETERS: Table - A CSRT table 728 * 729 * RETURN: None 730 * 731 * DESCRIPTION: Format the contents of a CSRT. This table type consists 732 * of an open-ended number of subtables. 733 * 734 ******************************************************************************/ 735 736 void 737 AcpiDmDumpCsrt ( 738 ACPI_TABLE_HEADER *Table) 739 { 740 ACPI_STATUS Status; 741 ACPI_CSRT_GROUP *SubTable; 742 ACPI_CSRT_SHARED_INFO *SharedInfoTable; 743 ACPI_CSRT_DESCRIPTOR *SubSubTable; 744 UINT32 Length = Table->Length; 745 UINT32 Offset = sizeof (ACPI_TABLE_CSRT); 746 UINT32 SubOffset; 747 UINT32 SubSubOffset; 748 UINT32 InfoLength; 749 750 751 /* The main table only contains the ACPI header, thus already handled */ 752 753 /* Subtables (Resource Groups) */ 754 755 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); 756 while (Offset < Table->Length) 757 { 758 /* Resource group subtable */ 759 760 AcpiOsPrintf ("\n"); 761 Status = AcpiDmDumpTable (Length, Offset, SubTable, 762 SubTable->Length, AcpiDmTableInfoCsrt0); 763 if (ACPI_FAILURE (Status)) 764 { 765 return; 766 } 767 768 /* Shared info subtable (One per resource group) */ 769 770 SubOffset = sizeof (ACPI_CSRT_GROUP); 771 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table, 772 Offset + SubOffset); 773 774 AcpiOsPrintf ("\n"); 775 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable, 776 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1); 777 if (ACPI_FAILURE (Status)) 778 { 779 return; 780 } 781 782 SubOffset += SubTable->SharedInfoLength; 783 784 /* Sub-Subtables (Resource Descriptors) */ 785 786 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, 787 Offset + SubOffset); 788 789 while ((SubOffset < SubTable->Length) && 790 ((Offset + SubOffset) < Table->Length)) 791 { 792 AcpiOsPrintf ("\n"); 793 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable, 794 SubSubTable->Length, AcpiDmTableInfoCsrt2); 795 if (ACPI_FAILURE (Status)) 796 { 797 return; 798 } 799 800 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR); 801 802 /* Resource-specific info buffer */ 803 804 InfoLength = SubSubTable->Length - SubSubOffset; 805 if (InfoLength) 806 { 807 Status = AcpiDmDumpTable (Length, 808 Offset + SubOffset + SubSubOffset, Table, 809 InfoLength, AcpiDmTableInfoCsrt2a); 810 if (ACPI_FAILURE (Status)) 811 { 812 return; 813 } 814 SubSubOffset += InfoLength; 815 } 816 817 /* Point to next sub-subtable */ 818 819 SubOffset += SubSubTable->Length; 820 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable, 821 SubSubTable->Length); 822 } 823 824 /* Point to next subtable */ 825 826 Offset += SubTable->Length; 827 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable, 828 SubTable->Length); 829 } 830 } 831 832 833 /******************************************************************************* 834 * 835 * FUNCTION: AcpiDmDumpDbg2 836 * 837 * PARAMETERS: Table - A DBG2 table 838 * 839 * RETURN: None 840 * 841 * DESCRIPTION: Format the contents of a DBG2. This table type consists 842 * of an open-ended number of subtables. 843 * 844 ******************************************************************************/ 845 846 void 847 AcpiDmDumpDbg2 ( 848 ACPI_TABLE_HEADER *Table) 849 { 850 ACPI_STATUS Status; 851 ACPI_DBG2_DEVICE *SubTable; 852 UINT32 Length = Table->Length; 853 UINT32 Offset = sizeof (ACPI_TABLE_DBG2); 854 UINT32 i; 855 UINT32 ArrayOffset; 856 UINT32 AbsoluteOffset; 857 UINT8 *Array; 858 859 860 /* Main table */ 861 862 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2); 863 if (ACPI_FAILURE (Status)) 864 { 865 return; 866 } 867 868 /* Subtables */ 869 870 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); 871 while (Offset < Table->Length) 872 { 873 AcpiOsPrintf ("\n"); 874 Status = AcpiDmDumpTable (Length, Offset, SubTable, 875 SubTable->Length, AcpiDmTableInfoDbg2Device); 876 if (ACPI_FAILURE (Status)) 877 { 878 return; 879 } 880 881 /* Dump the BaseAddress array */ 882 883 for (i = 0; i < SubTable->RegisterCount; i++) 884 { 885 ArrayOffset = SubTable->BaseAddressOffset + 886 (sizeof (ACPI_GENERIC_ADDRESS) * i); 887 AbsoluteOffset = Offset + ArrayOffset; 888 Array = (UINT8 *) SubTable + ArrayOffset; 889 890 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 891 SubTable->Length, AcpiDmTableInfoDbg2Addr); 892 if (ACPI_FAILURE (Status)) 893 { 894 return; 895 } 896 } 897 898 /* Dump the AddressSize array */ 899 900 for (i = 0; i < SubTable->RegisterCount; i++) 901 { 902 ArrayOffset = SubTable->AddressSizeOffset + 903 (sizeof (UINT32) * i); 904 AbsoluteOffset = Offset + ArrayOffset; 905 Array = (UINT8 *) SubTable + ArrayOffset; 906 907 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 908 SubTable->Length, AcpiDmTableInfoDbg2Size); 909 if (ACPI_FAILURE (Status)) 910 { 911 return; 912 } 913 } 914 915 /* Dump the Namestring (required) */ 916 917 AcpiOsPrintf ("\n"); 918 ArrayOffset = SubTable->NamepathOffset; 919 AbsoluteOffset = Offset + ArrayOffset; 920 Array = (UINT8 *) SubTable + ArrayOffset; 921 922 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 923 SubTable->Length, AcpiDmTableInfoDbg2Name); 924 if (ACPI_FAILURE (Status)) 925 { 926 return; 927 } 928 929 /* Dump the OemData (optional) */ 930 931 if (SubTable->OemDataOffset) 932 { 933 Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset, 934 Table, SubTable->OemDataLength, 935 AcpiDmTableInfoDbg2OemData); 936 if (ACPI_FAILURE (Status)) 937 { 938 return; 939 } 940 } 941 942 /* Point to next subtable */ 943 944 Offset += SubTable->Length; 945 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable, 946 SubTable->Length); 947 } 948 } 949 950 951 /******************************************************************************* 952 * 953 * FUNCTION: AcpiDmDumpDmar 954 * 955 * PARAMETERS: Table - A DMAR table 956 * 957 * RETURN: None 958 * 959 * DESCRIPTION: Format the contents of a DMAR. This table type consists 960 * of an open-ended number of subtables. 961 * 962 ******************************************************************************/ 963 964 void 965 AcpiDmDumpDmar ( 966 ACPI_TABLE_HEADER *Table) 967 { 968 ACPI_STATUS Status; 969 ACPI_DMAR_HEADER *SubTable; 970 UINT32 Length = Table->Length; 971 UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 972 ACPI_DMTABLE_INFO *InfoTable; 973 ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 974 UINT32 ScopeOffset; 975 UINT8 *PciPath; 976 UINT32 PathOffset; 977 978 979 /* Main table */ 980 981 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 982 if (ACPI_FAILURE (Status)) 983 { 984 return; 985 } 986 987 /* Subtables */ 988 989 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 990 while (Offset < Table->Length) 991 { 992 /* Common subtable header */ 993 994 AcpiOsPrintf ("\n"); 995 Status = AcpiDmDumpTable (Length, Offset, SubTable, 996 SubTable->Length, AcpiDmTableInfoDmarHdr); 997 if (ACPI_FAILURE (Status)) 998 { 999 return; 1000 } 1001 1002 AcpiOsPrintf ("\n"); 1003 1004 switch (SubTable->Type) 1005 { 1006 case ACPI_DMAR_TYPE_HARDWARE_UNIT: 1007 1008 InfoTable = AcpiDmTableInfoDmar0; 1009 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 1010 break; 1011 1012 case ACPI_DMAR_TYPE_RESERVED_MEMORY: 1013 1014 InfoTable = AcpiDmTableInfoDmar1; 1015 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 1016 break; 1017 1018 case ACPI_DMAR_TYPE_ROOT_ATS: 1019 1020 InfoTable = AcpiDmTableInfoDmar2; 1021 ScopeOffset = sizeof (ACPI_DMAR_ATSR); 1022 break; 1023 1024 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 1025 1026 InfoTable = AcpiDmTableInfoDmar3; 1027 ScopeOffset = sizeof (ACPI_DMAR_RHSA); 1028 break; 1029 1030 case ACPI_DMAR_TYPE_NAMESPACE: 1031 1032 InfoTable = AcpiDmTableInfoDmar4; 1033 ScopeOffset = sizeof (ACPI_DMAR_ANDD); 1034 break; 1035 1036 default: 1037 1038 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", 1039 SubTable->Type); 1040 return; 1041 } 1042 1043 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1044 SubTable->Length, InfoTable); 1045 if (ACPI_FAILURE (Status)) 1046 { 1047 return; 1048 } 1049 1050 /* 1051 * Dump the optional device scope entries 1052 */ 1053 if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 1054 (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE)) 1055 { 1056 /* These types do not support device scopes */ 1057 1058 goto NextSubtable; 1059 } 1060 1061 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); 1062 while (ScopeOffset < SubTable->Length) 1063 { 1064 AcpiOsPrintf ("\n"); 1065 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 1066 ScopeTable->Length, AcpiDmTableInfoDmarScope); 1067 if (ACPI_FAILURE (Status)) 1068 { 1069 return; 1070 } 1071 AcpiOsPrintf ("\n"); 1072 1073 /* Dump the PCI Path entries for this device scope */ 1074 1075 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 1076 1077 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 1078 sizeof (ACPI_DMAR_DEVICE_SCOPE)); 1079 1080 while (PathOffset < ScopeTable->Length) 1081 { 1082 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, 1083 "PCI Path"); 1084 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 1085 1086 /* Point to next PCI Path entry */ 1087 1088 PathOffset += 2; 1089 PciPath += 2; 1090 AcpiOsPrintf ("\n"); 1091 } 1092 1093 /* Point to next device scope entry */ 1094 1095 ScopeOffset += ScopeTable->Length; 1096 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 1097 ScopeTable, ScopeTable->Length); 1098 } 1099 1100 NextSubtable: 1101 /* Point to next subtable */ 1102 1103 Offset += SubTable->Length; 1104 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, 1105 SubTable->Length); 1106 } 1107 } 1108 1109 1110 /******************************************************************************* 1111 * 1112 * FUNCTION: AcpiDmDumpDrtm 1113 * 1114 * PARAMETERS: Table - A DRTM table 1115 * 1116 * RETURN: None 1117 * 1118 * DESCRIPTION: Format the contents of a DRTM. 1119 * 1120 ******************************************************************************/ 1121 1122 void 1123 AcpiDmDumpDrtm ( 1124 ACPI_TABLE_HEADER *Table) 1125 { 1126 ACPI_STATUS Status; 1127 UINT32 Offset; 1128 ACPI_DRTM_VTABLE_LIST *DrtmVtl; 1129 ACPI_DRTM_RESOURCE_LIST *DrtmRl; 1130 ACPI_DRTM_DPS_ID *DrtmDps; 1131 UINT32 Count; 1132 1133 1134 /* Main table */ 1135 1136 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, 1137 AcpiDmTableInfoDrtm); 1138 if (ACPI_FAILURE (Status)) 1139 { 1140 return; 1141 } 1142 1143 Offset = sizeof (ACPI_TABLE_DRTM); 1144 1145 /* Sub-tables */ 1146 1147 /* Dump ValidatedTable length */ 1148 1149 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset); 1150 AcpiOsPrintf ("\n"); 1151 Status = AcpiDmDumpTable (Table->Length, Offset, 1152 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables), 1153 AcpiDmTableInfoDrtm0); 1154 if (ACPI_FAILURE (Status)) 1155 { 1156 return; 1157 } 1158 1159 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables); 1160 1161 /* Dump Validated table addresses */ 1162 1163 Count = 0; 1164 while ((Offset < Table->Length) && 1165 (DrtmVtl->ValidatedTableCount > Count)) 1166 { 1167 Status = AcpiDmDumpTable (Table->Length, Offset, 1168 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64), 1169 AcpiDmTableInfoDrtm0a); 1170 if (ACPI_FAILURE (Status)) 1171 { 1172 return; 1173 } 1174 1175 Offset += sizeof (UINT64); 1176 Count++; 1177 } 1178 1179 /* Dump ResourceList length */ 1180 1181 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset); 1182 AcpiOsPrintf ("\n"); 1183 Status = AcpiDmDumpTable (Table->Length, Offset, 1184 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources), 1185 AcpiDmTableInfoDrtm1); 1186 if (ACPI_FAILURE (Status)) 1187 { 1188 return; 1189 } 1190 1191 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources); 1192 1193 /* Dump the Resource List */ 1194 1195 Count = 0; 1196 while ((Offset < Table->Length) && 1197 (DrtmRl->ResourceCount > Count)) 1198 { 1199 Status = AcpiDmDumpTable (Table->Length, Offset, 1200 ACPI_ADD_PTR (void, Table, Offset), 1201 sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a); 1202 if (ACPI_FAILURE (Status)) 1203 { 1204 return; 1205 } 1206 1207 Offset += sizeof (ACPI_DRTM_RESOURCE); 1208 Count++; 1209 } 1210 1211 /* Dump DPS */ 1212 1213 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset); 1214 AcpiOsPrintf ("\n"); 1215 (void) AcpiDmDumpTable (Table->Length, Offset, 1216 DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2); 1217 } 1218 1219 1220 /******************************************************************************* 1221 * 1222 * FUNCTION: AcpiDmDumpEinj 1223 * 1224 * PARAMETERS: Table - A EINJ table 1225 * 1226 * RETURN: None 1227 * 1228 * DESCRIPTION: Format the contents of a EINJ. This table type consists 1229 * of an open-ended number of subtables. 1230 * 1231 ******************************************************************************/ 1232 1233 void 1234 AcpiDmDumpEinj ( 1235 ACPI_TABLE_HEADER *Table) 1236 { 1237 ACPI_STATUS Status; 1238 ACPI_WHEA_HEADER *SubTable; 1239 UINT32 Length = Table->Length; 1240 UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 1241 1242 1243 /* Main table */ 1244 1245 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 1246 if (ACPI_FAILURE (Status)) 1247 { 1248 return; 1249 } 1250 1251 /* Subtables */ 1252 1253 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1254 while (Offset < Table->Length) 1255 { 1256 AcpiOsPrintf ("\n"); 1257 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1258 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 1259 if (ACPI_FAILURE (Status)) 1260 { 1261 return; 1262 } 1263 1264 /* Point to next subtable (each subtable is of fixed length) */ 1265 1266 Offset += sizeof (ACPI_WHEA_HEADER); 1267 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1268 sizeof (ACPI_WHEA_HEADER)); 1269 } 1270 } 1271 1272 1273 /******************************************************************************* 1274 * 1275 * FUNCTION: AcpiDmDumpErst 1276 * 1277 * PARAMETERS: Table - A ERST table 1278 * 1279 * RETURN: None 1280 * 1281 * DESCRIPTION: Format the contents of a ERST. This table type consists 1282 * of an open-ended number of subtables. 1283 * 1284 ******************************************************************************/ 1285 1286 void 1287 AcpiDmDumpErst ( 1288 ACPI_TABLE_HEADER *Table) 1289 { 1290 ACPI_STATUS Status; 1291 ACPI_WHEA_HEADER *SubTable; 1292 UINT32 Length = Table->Length; 1293 UINT32 Offset = sizeof (ACPI_TABLE_ERST); 1294 1295 1296 /* Main table */ 1297 1298 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 1299 if (ACPI_FAILURE (Status)) 1300 { 1301 return; 1302 } 1303 1304 /* Subtables */ 1305 1306 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1307 while (Offset < Table->Length) 1308 { 1309 AcpiOsPrintf ("\n"); 1310 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1311 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 1312 if (ACPI_FAILURE (Status)) 1313 { 1314 return; 1315 } 1316 1317 /* Point to next subtable (each subtable is of fixed length) */ 1318 1319 Offset += sizeof (ACPI_WHEA_HEADER); 1320 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1321 sizeof (ACPI_WHEA_HEADER)); 1322 } 1323 } 1324 1325 1326 /******************************************************************************* 1327 * 1328 * FUNCTION: AcpiDmDumpFpdt 1329 * 1330 * PARAMETERS: Table - A FPDT table 1331 * 1332 * RETURN: None 1333 * 1334 * DESCRIPTION: Format the contents of a FPDT. This table type consists 1335 * of an open-ended number of subtables. 1336 * 1337 ******************************************************************************/ 1338 1339 void 1340 AcpiDmDumpFpdt ( 1341 ACPI_TABLE_HEADER *Table) 1342 { 1343 ACPI_STATUS Status; 1344 ACPI_FPDT_HEADER *SubTable; 1345 UINT32 Length = Table->Length; 1346 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1347 ACPI_DMTABLE_INFO *InfoTable; 1348 1349 1350 /* There is no main table (other than the standard ACPI header) */ 1351 1352 /* Subtables */ 1353 1354 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 1355 while (Offset < Table->Length) 1356 { 1357 /* Common subtable header */ 1358 1359 AcpiOsPrintf ("\n"); 1360 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1361 SubTable->Length, AcpiDmTableInfoFpdtHdr); 1362 if (ACPI_FAILURE (Status)) 1363 { 1364 return; 1365 } 1366 1367 switch (SubTable->Type) 1368 { 1369 case ACPI_FPDT_TYPE_BOOT: 1370 1371 InfoTable = AcpiDmTableInfoFpdt0; 1372 break; 1373 1374 case ACPI_FPDT_TYPE_S3PERF: 1375 1376 InfoTable = AcpiDmTableInfoFpdt1; 1377 break; 1378 1379 default: 1380 1381 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", 1382 SubTable->Type); 1383 1384 /* Attempt to continue */ 1385 1386 if (!SubTable->Length) 1387 { 1388 AcpiOsPrintf ("Invalid zero length subtable\n"); 1389 return; 1390 } 1391 goto NextSubTable; 1392 } 1393 1394 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1395 SubTable->Length, InfoTable); 1396 if (ACPI_FAILURE (Status)) 1397 { 1398 return; 1399 } 1400 1401 NextSubTable: 1402 /* Point to next subtable */ 1403 1404 Offset += SubTable->Length; 1405 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, 1406 SubTable->Length); 1407 } 1408 } 1409 1410 1411 /******************************************************************************* 1412 * 1413 * FUNCTION: AcpiDmDumpGtdt 1414 * 1415 * PARAMETERS: Table - A GTDT table 1416 * 1417 * RETURN: None 1418 * 1419 * DESCRIPTION: Format the contents of a GTDT. This table type consists 1420 * of an open-ended number of subtables. 1421 * 1422 ******************************************************************************/ 1423 1424 void 1425 AcpiDmDumpGtdt ( 1426 ACPI_TABLE_HEADER *Table) 1427 { 1428 ACPI_STATUS Status; 1429 ACPI_GTDT_HEADER *SubTable; 1430 UINT32 Length = Table->Length; 1431 UINT32 Offset = sizeof (ACPI_TABLE_GTDT); 1432 ACPI_DMTABLE_INFO *InfoTable; 1433 UINT32 SubTableLength; 1434 UINT32 GtCount; 1435 ACPI_GTDT_TIMER_ENTRY *GtxTable; 1436 1437 1438 /* Main table */ 1439 1440 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt); 1441 if (ACPI_FAILURE (Status)) 1442 { 1443 return; 1444 } 1445 1446 /* Subtables */ 1447 1448 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); 1449 while (Offset < Table->Length) 1450 { 1451 /* Common subtable header */ 1452 1453 AcpiOsPrintf ("\n"); 1454 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1455 SubTable->Length, AcpiDmTableInfoGtdtHdr); 1456 if (ACPI_FAILURE (Status)) 1457 { 1458 return; 1459 } 1460 1461 GtCount = 0; 1462 switch (SubTable->Type) 1463 { 1464 case ACPI_GTDT_TYPE_TIMER_BLOCK: 1465 1466 SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); 1467 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 1468 SubTable))->TimerCount; 1469 1470 InfoTable = AcpiDmTableInfoGtdt0; 1471 break; 1472 1473 case ACPI_GTDT_TYPE_WATCHDOG: 1474 1475 SubTableLength = sizeof (ACPI_GTDT_WATCHDOG); 1476 1477 InfoTable = AcpiDmTableInfoGtdt1; 1478 break; 1479 1480 default: 1481 1482 /* Cannot continue on unknown type - no length */ 1483 1484 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", 1485 SubTable->Type); 1486 return; 1487 } 1488 1489 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1490 SubTable->Length, InfoTable); 1491 if (ACPI_FAILURE (Status)) 1492 { 1493 return; 1494 } 1495 1496 /* Point to end of current subtable (each subtable above is of fixed length) */ 1497 1498 Offset += SubTableLength; 1499 1500 /* If there are any Gt Timer Blocks from above, dump them now */ 1501 1502 if (GtCount) 1503 { 1504 GtxTable = ACPI_ADD_PTR ( 1505 ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength); 1506 SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); 1507 1508 while (GtCount) 1509 { 1510 AcpiOsPrintf ("\n"); 1511 Status = AcpiDmDumpTable (Length, Offset, GtxTable, 1512 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a); 1513 if (ACPI_FAILURE (Status)) 1514 { 1515 return; 1516 } 1517 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY); 1518 GtxTable++; 1519 GtCount--; 1520 } 1521 } 1522 1523 /* Point to next subtable */ 1524 1525 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength); 1526 } 1527 } 1528 1529 1530 /******************************************************************************* 1531 * 1532 * FUNCTION: AcpiDmDumpHest 1533 * 1534 * PARAMETERS: Table - A HEST table 1535 * 1536 * RETURN: None 1537 * 1538 * DESCRIPTION: Format the contents of a HEST. This table type consists 1539 * of an open-ended number of subtables. 1540 * 1541 ******************************************************************************/ 1542 1543 void 1544 AcpiDmDumpHest ( 1545 ACPI_TABLE_HEADER *Table) 1546 { 1547 ACPI_STATUS Status; 1548 ACPI_HEST_HEADER *SubTable; 1549 UINT32 Length = Table->Length; 1550 UINT32 Offset = sizeof (ACPI_TABLE_HEST); 1551 ACPI_DMTABLE_INFO *InfoTable; 1552 UINT32 SubTableLength; 1553 UINT32 BankCount; 1554 ACPI_HEST_IA_ERROR_BANK *BankTable; 1555 1556 1557 /* Main table */ 1558 1559 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 1560 if (ACPI_FAILURE (Status)) 1561 { 1562 return; 1563 } 1564 1565 /* Subtables */ 1566 1567 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 1568 while (Offset < Table->Length) 1569 { 1570 BankCount = 0; 1571 switch (SubTable->Type) 1572 { 1573 case ACPI_HEST_TYPE_IA32_CHECK: 1574 1575 InfoTable = AcpiDmTableInfoHest0; 1576 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 1577 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1578 SubTable))->NumHardwareBanks; 1579 break; 1580 1581 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1582 1583 InfoTable = AcpiDmTableInfoHest1; 1584 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); 1585 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1586 SubTable))->NumHardwareBanks; 1587 break; 1588 1589 case ACPI_HEST_TYPE_IA32_NMI: 1590 1591 InfoTable = AcpiDmTableInfoHest2; 1592 SubTableLength = sizeof (ACPI_HEST_IA_NMI); 1593 break; 1594 1595 case ACPI_HEST_TYPE_AER_ROOT_PORT: 1596 1597 InfoTable = AcpiDmTableInfoHest6; 1598 SubTableLength = sizeof (ACPI_HEST_AER_ROOT); 1599 break; 1600 1601 case ACPI_HEST_TYPE_AER_ENDPOINT: 1602 1603 InfoTable = AcpiDmTableInfoHest7; 1604 SubTableLength = sizeof (ACPI_HEST_AER); 1605 break; 1606 1607 case ACPI_HEST_TYPE_AER_BRIDGE: 1608 1609 InfoTable = AcpiDmTableInfoHest8; 1610 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); 1611 break; 1612 1613 case ACPI_HEST_TYPE_GENERIC_ERROR: 1614 1615 InfoTable = AcpiDmTableInfoHest9; 1616 SubTableLength = sizeof (ACPI_HEST_GENERIC); 1617 break; 1618 1619 default: 1620 1621 /* Cannot continue on unknown type - no length */ 1622 1623 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", 1624 SubTable->Type); 1625 return; 1626 } 1627 1628 AcpiOsPrintf ("\n"); 1629 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1630 SubTableLength, InfoTable); 1631 if (ACPI_FAILURE (Status)) 1632 { 1633 return; 1634 } 1635 1636 /* Point to end of current subtable (each subtable above is of fixed length) */ 1637 1638 Offset += SubTableLength; 1639 1640 /* If there are any (fixed-length) Error Banks from above, dump them now */ 1641 1642 if (BankCount) 1643 { 1644 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, 1645 SubTableLength); 1646 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 1647 1648 while (BankCount) 1649 { 1650 AcpiOsPrintf ("\n"); 1651 Status = AcpiDmDumpTable (Length, Offset, BankTable, 1652 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 1653 if (ACPI_FAILURE (Status)) 1654 { 1655 return; 1656 } 1657 1658 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 1659 BankTable++; 1660 BankCount--; 1661 } 1662 } 1663 1664 /* Point to next subtable */ 1665 1666 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); 1667 } 1668 } 1669 1670 1671 /******************************************************************************* 1672 * 1673 * FUNCTION: AcpiDmDumpIort 1674 * 1675 * PARAMETERS: Table - A IORT table 1676 * 1677 * RETURN: None 1678 * 1679 * DESCRIPTION: Format the contents of a IORT 1680 * 1681 ******************************************************************************/ 1682 1683 void 1684 AcpiDmDumpIort ( 1685 ACPI_TABLE_HEADER *Table) 1686 { 1687 ACPI_STATUS Status; 1688 ACPI_TABLE_IORT *Iort; 1689 ACPI_IORT_NODE *IortNode; 1690 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL; 1691 ACPI_IORT_SMMU *IortSmmu = NULL; 1692 UINT32 Offset; 1693 UINT32 NodeOffset; 1694 UINT32 Length; 1695 ACPI_DMTABLE_INFO *InfoTable; 1696 char *String; 1697 UINT32 i; 1698 1699 1700 /* Main table */ 1701 1702 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); 1703 if (ACPI_FAILURE (Status)) 1704 { 1705 return; 1706 } 1707 1708 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table); 1709 Offset = sizeof (ACPI_TABLE_IORT); 1710 1711 /* Dump the OptionalPadding (optional) */ 1712 1713 if (Iort->NodeOffset > Offset) 1714 { 1715 Status = AcpiDmDumpTable (Table->Length, Offset, Table, 1716 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); 1717 if (ACPI_FAILURE (Status)) 1718 { 1719 return; 1720 } 1721 } 1722 1723 Offset = Iort->NodeOffset; 1724 while (Offset < Table->Length) 1725 { 1726 /* Common subtable header */ 1727 1728 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset); 1729 AcpiOsPrintf ("\n"); 1730 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); 1731 Status = AcpiDmDumpTable (Table->Length, Offset, 1732 IortNode, Length, AcpiDmTableInfoIortHdr); 1733 if (ACPI_FAILURE (Status)) 1734 { 1735 return; 1736 } 1737 1738 NodeOffset = Length; 1739 1740 switch (IortNode->Type) 1741 { 1742 case ACPI_IORT_NODE_ITS_GROUP: 1743 1744 InfoTable = AcpiDmTableInfoIort0; 1745 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers); 1746 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset); 1747 break; 1748 1749 case ACPI_IORT_NODE_NAMED_COMPONENT: 1750 1751 InfoTable = AcpiDmTableInfoIort1; 1752 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName); 1753 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length); 1754 Length += strlen (String) + 1; 1755 break; 1756 1757 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: 1758 1759 InfoTable = AcpiDmTableInfoIort2; 1760 Length = IortNode->Length - NodeOffset; 1761 break; 1762 1763 case ACPI_IORT_NODE_SMMU: 1764 1765 InfoTable = AcpiDmTableInfoIort3; 1766 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts); 1767 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset); 1768 break; 1769 1770 default: 1771 1772 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n", 1773 IortNode->Type); 1774 1775 /* Attempt to continue */ 1776 1777 if (!IortNode->Length) 1778 { 1779 AcpiOsPrintf ("Invalid zero length IORT node\n"); 1780 return; 1781 } 1782 goto NextSubTable; 1783 } 1784 1785 /* Dump the node subtable header */ 1786 1787 AcpiOsPrintf ("\n"); 1788 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1789 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1790 Length, InfoTable); 1791 if (ACPI_FAILURE (Status)) 1792 { 1793 return; 1794 } 1795 1796 NodeOffset += Length; 1797 1798 /* Dump the node specific data */ 1799 1800 switch (IortNode->Type) 1801 { 1802 case ACPI_IORT_NODE_ITS_GROUP: 1803 1804 /* Validate IortItsGroup to avoid compiler warnings */ 1805 1806 if (IortItsGroup) 1807 { 1808 for (i = 0; i < IortItsGroup->ItsCount; i++) 1809 { 1810 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1811 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1812 4, AcpiDmTableInfoIort0a); 1813 NodeOffset += 4; 1814 } 1815 } 1816 break; 1817 1818 case ACPI_IORT_NODE_NAMED_COMPONENT: 1819 1820 /* Dump the Padding (optional) */ 1821 1822 if (IortNode->Length > NodeOffset) 1823 { 1824 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1825 Table, IortNode->Length - NodeOffset, 1826 AcpiDmTableInfoIort1a); 1827 if (ACPI_FAILURE (Status)) 1828 { 1829 return; 1830 } 1831 } 1832 break; 1833 1834 case ACPI_IORT_NODE_SMMU: 1835 1836 AcpiOsPrintf ("\n"); 1837 1838 /* Validate IortSmmu to avoid compiler warnings */ 1839 1840 if (IortSmmu) 1841 { 1842 Length = 2 * sizeof (UINT64); 1843 NodeOffset = IortSmmu->GlobalInterruptOffset; 1844 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1845 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1846 Length, AcpiDmTableInfoIort3a); 1847 if (ACPI_FAILURE (Status)) 1848 { 1849 return; 1850 } 1851 1852 NodeOffset = IortSmmu->ContextInterruptOffset; 1853 for (i = 0; i < IortSmmu->ContextInterruptCount; i++) 1854 { 1855 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1856 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1857 8, AcpiDmTableInfoIort3b); 1858 if (ACPI_FAILURE (Status)) 1859 { 1860 return; 1861 } 1862 1863 NodeOffset += 8; 1864 } 1865 1866 NodeOffset = IortSmmu->PmuInterruptOffset; 1867 for (i = 0; i < IortSmmu->PmuInterruptCount; i++) 1868 { 1869 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1870 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1871 8, AcpiDmTableInfoIort3c); 1872 if (ACPI_FAILURE (Status)) 1873 { 1874 return; 1875 } 1876 1877 NodeOffset += 8; 1878 } 1879 } 1880 break; 1881 1882 default: 1883 1884 break; 1885 } 1886 1887 /* Dump the ID mappings */ 1888 1889 NodeOffset = IortNode->MappingOffset; 1890 for (i = 0; i < IortNode->MappingCount; i++) 1891 { 1892 AcpiOsPrintf ("\n"); 1893 Length = sizeof (ACPI_IORT_ID_MAPPING); 1894 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, 1895 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 1896 Length, AcpiDmTableInfoIortMap); 1897 if (ACPI_FAILURE (Status)) 1898 { 1899 return; 1900 } 1901 1902 NodeOffset += Length; 1903 } 1904 1905 NextSubTable: 1906 /* Point to next node subtable */ 1907 1908 Offset += IortNode->Length; 1909 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length); 1910 } 1911 } 1912 1913 1914 /******************************************************************************* 1915 * 1916 * FUNCTION: AcpiDmDumpIvrs 1917 * 1918 * PARAMETERS: Table - A IVRS table 1919 * 1920 * RETURN: None 1921 * 1922 * DESCRIPTION: Format the contents of a IVRS 1923 * 1924 ******************************************************************************/ 1925 1926 static UINT8 EntrySizes[] = {4,8,16,32}; 1927 1928 void 1929 AcpiDmDumpIvrs ( 1930 ACPI_TABLE_HEADER *Table) 1931 { 1932 ACPI_STATUS Status; 1933 UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 1934 UINT32 EntryOffset; 1935 UINT32 EntryLength; 1936 UINT32 EntryType; 1937 ACPI_IVRS_DE_HEADER *DeviceEntry; 1938 ACPI_IVRS_HEADER *SubTable; 1939 ACPI_DMTABLE_INFO *InfoTable; 1940 1941 1942 /* Main table */ 1943 1944 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 1945 if (ACPI_FAILURE (Status)) 1946 { 1947 return; 1948 } 1949 1950 /* Subtables */ 1951 1952 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 1953 while (Offset < Table->Length) 1954 { 1955 /* Common subtable header */ 1956 1957 AcpiOsPrintf ("\n"); 1958 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1959 SubTable->Length, AcpiDmTableInfoIvrsHdr); 1960 if (ACPI_FAILURE (Status)) 1961 { 1962 return; 1963 } 1964 1965 switch (SubTable->Type) 1966 { 1967 case ACPI_IVRS_TYPE_HARDWARE: 1968 1969 InfoTable = AcpiDmTableInfoIvrs0; 1970 break; 1971 1972 case ACPI_IVRS_TYPE_MEMORY1: 1973 case ACPI_IVRS_TYPE_MEMORY2: 1974 case ACPI_IVRS_TYPE_MEMORY3: 1975 1976 InfoTable = AcpiDmTableInfoIvrs1; 1977 break; 1978 1979 default: 1980 1981 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", 1982 SubTable->Type); 1983 1984 /* Attempt to continue */ 1985 1986 if (!SubTable->Length) 1987 { 1988 AcpiOsPrintf ("Invalid zero length subtable\n"); 1989 return; 1990 } 1991 goto NextSubTable; 1992 } 1993 1994 /* Dump the subtable */ 1995 1996 AcpiOsPrintf ("\n"); 1997 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1998 SubTable->Length, InfoTable); 1999 if (ACPI_FAILURE (Status)) 2000 { 2001 return; 2002 } 2003 2004 /* The hardware subtable can contain multiple device entries */ 2005 2006 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) 2007 { 2008 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 2009 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, 2010 sizeof (ACPI_IVRS_HARDWARE)); 2011 2012 while (EntryOffset < (Offset + SubTable->Length)) 2013 { 2014 AcpiOsPrintf ("\n"); 2015 /* 2016 * Upper 2 bits of Type encode the length of the device entry 2017 * 2018 * 00 = 4 byte 2019 * 01 = 8 byte 2020 * 10 = 16 byte - currently no entries defined 2021 * 11 = 32 byte - currently no entries defined 2022 */ 2023 EntryType = DeviceEntry->Type; 2024 EntryLength = EntrySizes [EntryType >> 6]; 2025 2026 switch (EntryType) 2027 { 2028 /* 4-byte device entries */ 2029 2030 case ACPI_IVRS_TYPE_PAD4: 2031 case ACPI_IVRS_TYPE_ALL: 2032 case ACPI_IVRS_TYPE_SELECT: 2033 case ACPI_IVRS_TYPE_START: 2034 case ACPI_IVRS_TYPE_END: 2035 2036 InfoTable = AcpiDmTableInfoIvrs4; 2037 break; 2038 2039 /* 8-byte entries, type A */ 2040 2041 case ACPI_IVRS_TYPE_ALIAS_SELECT: 2042 case ACPI_IVRS_TYPE_ALIAS_START: 2043 2044 InfoTable = AcpiDmTableInfoIvrs8a; 2045 break; 2046 2047 /* 8-byte entries, type B */ 2048 2049 case ACPI_IVRS_TYPE_PAD8: 2050 case ACPI_IVRS_TYPE_EXT_SELECT: 2051 case ACPI_IVRS_TYPE_EXT_START: 2052 2053 InfoTable = AcpiDmTableInfoIvrs8b; 2054 break; 2055 2056 /* 8-byte entries, type C */ 2057 2058 case ACPI_IVRS_TYPE_SPECIAL: 2059 2060 InfoTable = AcpiDmTableInfoIvrs8c; 2061 break; 2062 2063 default: 2064 InfoTable = AcpiDmTableInfoIvrs4; 2065 AcpiOsPrintf ( 2066 "\n**** Unknown IVRS device entry type/length: " 2067 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 2068 EntryType, EntryLength, EntryOffset); 2069 break; 2070 } 2071 2072 /* Dump the Device Entry */ 2073 2074 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 2075 DeviceEntry, EntryLength, InfoTable); 2076 if (ACPI_FAILURE (Status)) 2077 { 2078 return; 2079 } 2080 2081 EntryOffset += EntryLength; 2082 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 2083 EntryLength); 2084 } 2085 } 2086 2087 NextSubTable: 2088 /* Point to next subtable */ 2089 2090 Offset += SubTable->Length; 2091 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); 2092 } 2093 } 2094 2095 2096 /******************************************************************************* 2097 * 2098 * FUNCTION: AcpiDmDumpLpit 2099 * 2100 * PARAMETERS: Table - A LPIT table 2101 * 2102 * RETURN: None 2103 * 2104 * DESCRIPTION: Format the contents of a LPIT. This table type consists 2105 * of an open-ended number of subtables. Note: There are no 2106 * entries in the main table. An LPIT consists of the table 2107 * header and then subtables only. 2108 * 2109 ******************************************************************************/ 2110 2111 void 2112 AcpiDmDumpLpit ( 2113 ACPI_TABLE_HEADER *Table) 2114 { 2115 ACPI_STATUS Status; 2116 ACPI_LPIT_HEADER *SubTable; 2117 UINT32 Length = Table->Length; 2118 UINT32 Offset = sizeof (ACPI_TABLE_LPIT); 2119 ACPI_DMTABLE_INFO *InfoTable; 2120 UINT32 SubTableLength; 2121 2122 2123 /* Subtables */ 2124 2125 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); 2126 while (Offset < Table->Length) 2127 { 2128 /* Common subtable header */ 2129 2130 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2131 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); 2132 if (ACPI_FAILURE (Status)) 2133 { 2134 return; 2135 } 2136 2137 switch (SubTable->Type) 2138 { 2139 case ACPI_LPIT_TYPE_NATIVE_CSTATE: 2140 2141 InfoTable = AcpiDmTableInfoLpit0; 2142 SubTableLength = sizeof (ACPI_LPIT_NATIVE); 2143 break; 2144 2145 default: 2146 2147 /* Cannot continue on unknown type - no length */ 2148 2149 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", 2150 SubTable->Type); 2151 return; 2152 } 2153 2154 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2155 SubTableLength, InfoTable); 2156 if (ACPI_FAILURE (Status)) 2157 { 2158 return; 2159 } 2160 2161 AcpiOsPrintf ("\n"); 2162 2163 /* Point to next subtable */ 2164 2165 Offset += SubTableLength; 2166 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength); 2167 } 2168 } 2169 2170 2171 /******************************************************************************* 2172 * 2173 * FUNCTION: AcpiDmDumpMadt 2174 * 2175 * PARAMETERS: Table - A MADT table 2176 * 2177 * RETURN: None 2178 * 2179 * DESCRIPTION: Format the contents of a MADT. This table type consists 2180 * of an open-ended number of subtables. 2181 * 2182 ******************************************************************************/ 2183 2184 void 2185 AcpiDmDumpMadt ( 2186 ACPI_TABLE_HEADER *Table) 2187 { 2188 ACPI_STATUS Status; 2189 ACPI_SUBTABLE_HEADER *SubTable; 2190 UINT32 Length = Table->Length; 2191 UINT32 Offset = sizeof (ACPI_TABLE_MADT); 2192 ACPI_DMTABLE_INFO *InfoTable; 2193 2194 2195 /* Main table */ 2196 2197 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 2198 if (ACPI_FAILURE (Status)) 2199 { 2200 return; 2201 } 2202 2203 /* Subtables */ 2204 2205 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2206 while (Offset < Table->Length) 2207 { 2208 /* Common subtable header */ 2209 2210 AcpiOsPrintf ("\n"); 2211 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2212 SubTable->Length, AcpiDmTableInfoMadtHdr); 2213 if (ACPI_FAILURE (Status)) 2214 { 2215 return; 2216 } 2217 2218 switch (SubTable->Type) 2219 { 2220 case ACPI_MADT_TYPE_LOCAL_APIC: 2221 2222 InfoTable = AcpiDmTableInfoMadt0; 2223 break; 2224 2225 case ACPI_MADT_TYPE_IO_APIC: 2226 2227 InfoTable = AcpiDmTableInfoMadt1; 2228 break; 2229 2230 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 2231 2232 InfoTable = AcpiDmTableInfoMadt2; 2233 break; 2234 2235 case ACPI_MADT_TYPE_NMI_SOURCE: 2236 2237 InfoTable = AcpiDmTableInfoMadt3; 2238 break; 2239 2240 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 2241 2242 InfoTable = AcpiDmTableInfoMadt4; 2243 break; 2244 2245 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 2246 2247 InfoTable = AcpiDmTableInfoMadt5; 2248 break; 2249 2250 case ACPI_MADT_TYPE_IO_SAPIC: 2251 2252 InfoTable = AcpiDmTableInfoMadt6; 2253 break; 2254 2255 case ACPI_MADT_TYPE_LOCAL_SAPIC: 2256 2257 InfoTable = AcpiDmTableInfoMadt7; 2258 break; 2259 2260 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 2261 2262 InfoTable = AcpiDmTableInfoMadt8; 2263 break; 2264 2265 case ACPI_MADT_TYPE_LOCAL_X2APIC: 2266 2267 InfoTable = AcpiDmTableInfoMadt9; 2268 break; 2269 2270 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 2271 2272 InfoTable = AcpiDmTableInfoMadt10; 2273 break; 2274 2275 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 2276 2277 InfoTable = AcpiDmTableInfoMadt11; 2278 break; 2279 2280 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 2281 2282 InfoTable = AcpiDmTableInfoMadt12; 2283 break; 2284 2285 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 2286 2287 InfoTable = AcpiDmTableInfoMadt13; 2288 break; 2289 2290 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 2291 2292 InfoTable = AcpiDmTableInfoMadt14; 2293 break; 2294 2295 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR: 2296 2297 InfoTable = AcpiDmTableInfoMadt15; 2298 break; 2299 2300 default: 2301 2302 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", 2303 SubTable->Type); 2304 2305 /* Attempt to continue */ 2306 2307 if (!SubTable->Length) 2308 { 2309 AcpiOsPrintf ("Invalid zero length subtable\n"); 2310 return; 2311 } 2312 2313 goto NextSubTable; 2314 } 2315 2316 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2317 SubTable->Length, InfoTable); 2318 if (ACPI_FAILURE (Status)) 2319 { 2320 return; 2321 } 2322 2323 NextSubTable: 2324 /* Point to next subtable */ 2325 2326 Offset += SubTable->Length; 2327 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, 2328 SubTable->Length); 2329 } 2330 } 2331 2332 2333 /******************************************************************************* 2334 * 2335 * FUNCTION: AcpiDmDumpMcfg 2336 * 2337 * PARAMETERS: Table - A MCFG Table 2338 * 2339 * RETURN: None 2340 * 2341 * DESCRIPTION: Format the contents of a MCFG table 2342 * 2343 ******************************************************************************/ 2344 2345 void 2346 AcpiDmDumpMcfg ( 2347 ACPI_TABLE_HEADER *Table) 2348 { 2349 ACPI_STATUS Status; 2350 UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 2351 ACPI_MCFG_ALLOCATION *SubTable; 2352 2353 2354 /* Main table */ 2355 2356 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 2357 if (ACPI_FAILURE (Status)) 2358 { 2359 return; 2360 } 2361 2362 /* Subtables */ 2363 2364 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 2365 while (Offset < Table->Length) 2366 { 2367 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 2368 { 2369 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 2370 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 2371 return; 2372 } 2373 2374 AcpiOsPrintf ("\n"); 2375 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2376 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 2377 if (ACPI_FAILURE (Status)) 2378 { 2379 return; 2380 } 2381 2382 /* Point to next subtable (each subtable is of fixed length) */ 2383 2384 Offset += sizeof (ACPI_MCFG_ALLOCATION); 2385 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, 2386 sizeof (ACPI_MCFG_ALLOCATION)); 2387 } 2388 } 2389 2390 2391 /******************************************************************************* 2392 * 2393 * FUNCTION: AcpiDmDumpMpst 2394 * 2395 * PARAMETERS: Table - A MPST Table 2396 * 2397 * RETURN: None 2398 * 2399 * DESCRIPTION: Format the contents of a MPST table 2400 * 2401 ******************************************************************************/ 2402 2403 void 2404 AcpiDmDumpMpst ( 2405 ACPI_TABLE_HEADER *Table) 2406 { 2407 ACPI_STATUS Status; 2408 UINT32 Offset = sizeof (ACPI_TABLE_MPST); 2409 ACPI_MPST_POWER_NODE *SubTable0; 2410 ACPI_MPST_POWER_STATE *SubTable0A; 2411 ACPI_MPST_COMPONENT *SubTable0B; 2412 ACPI_MPST_DATA_HDR *SubTable1; 2413 ACPI_MPST_POWER_DATA *SubTable2; 2414 UINT16 SubtableCount; 2415 UINT32 PowerStateCount; 2416 UINT32 ComponentCount; 2417 2418 2419 /* Main table */ 2420 2421 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 2422 if (ACPI_FAILURE (Status)) 2423 { 2424 return; 2425 } 2426 2427 /* Subtable: Memory Power Node(s) */ 2428 2429 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 2430 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 2431 2432 while ((Offset < Table->Length) && SubtableCount) 2433 { 2434 AcpiOsPrintf ("\n"); 2435 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, 2436 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 2437 if (ACPI_FAILURE (Status)) 2438 { 2439 return; 2440 } 2441 2442 /* Extract the sub-subtable counts */ 2443 2444 PowerStateCount = SubTable0->NumPowerStates; 2445 ComponentCount = SubTable0->NumPhysicalComponents; 2446 Offset += sizeof (ACPI_MPST_POWER_NODE); 2447 2448 /* Sub-subtables - Memory Power State Structure(s) */ 2449 2450 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, 2451 sizeof (ACPI_MPST_POWER_NODE)); 2452 2453 while (PowerStateCount) 2454 { 2455 AcpiOsPrintf ("\n"); 2456 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, 2457 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 2458 if (ACPI_FAILURE (Status)) 2459 { 2460 return; 2461 } 2462 2463 SubTable0A++; 2464 PowerStateCount--; 2465 Offset += sizeof (ACPI_MPST_POWER_STATE); 2466 } 2467 2468 /* Sub-subtables - Physical Component ID Structure(s) */ 2469 2470 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); 2471 2472 if (ComponentCount) 2473 { 2474 AcpiOsPrintf ("\n"); 2475 } 2476 2477 while (ComponentCount) 2478 { 2479 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, 2480 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 2481 if (ACPI_FAILURE (Status)) 2482 { 2483 return; 2484 } 2485 2486 SubTable0B++; 2487 ComponentCount--; 2488 Offset += sizeof (ACPI_MPST_COMPONENT); 2489 } 2490 2491 /* Point to next Memory Power Node subtable */ 2492 2493 SubtableCount--; 2494 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, 2495 sizeof (ACPI_MPST_POWER_NODE) + 2496 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) + 2497 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents)); 2498 } 2499 2500 /* Subtable: Count of Memory Power State Characteristic structures */ 2501 2502 AcpiOsPrintf ("\n"); 2503 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0); 2504 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1, 2505 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 2506 if (ACPI_FAILURE (Status)) 2507 { 2508 return; 2509 } 2510 2511 SubtableCount = SubTable1->CharacteristicsCount; 2512 Offset += sizeof (ACPI_MPST_DATA_HDR); 2513 2514 /* Subtable: Memory Power State Characteristics structure(s) */ 2515 2516 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, 2517 sizeof (ACPI_MPST_DATA_HDR)); 2518 2519 while ((Offset < Table->Length) && SubtableCount) 2520 { 2521 AcpiOsPrintf ("\n"); 2522 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, 2523 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 2524 if (ACPI_FAILURE (Status)) 2525 { 2526 return; 2527 } 2528 2529 SubTable2++; 2530 SubtableCount--; 2531 Offset += sizeof (ACPI_MPST_POWER_DATA); 2532 } 2533 } 2534 2535 2536 /******************************************************************************* 2537 * 2538 * FUNCTION: AcpiDmDumpMsct 2539 * 2540 * PARAMETERS: Table - A MSCT table 2541 * 2542 * RETURN: None 2543 * 2544 * DESCRIPTION: Format the contents of a MSCT 2545 * 2546 ******************************************************************************/ 2547 2548 void 2549 AcpiDmDumpMsct ( 2550 ACPI_TABLE_HEADER *Table) 2551 { 2552 ACPI_STATUS Status; 2553 UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 2554 ACPI_MSCT_PROXIMITY *SubTable; 2555 2556 2557 /* Main table */ 2558 2559 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 2560 if (ACPI_FAILURE (Status)) 2561 { 2562 return; 2563 } 2564 2565 /* Subtables */ 2566 2567 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 2568 while (Offset < Table->Length) 2569 { 2570 /* Common subtable header */ 2571 2572 AcpiOsPrintf ("\n"); 2573 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2574 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 2575 if (ACPI_FAILURE (Status)) 2576 { 2577 return; 2578 } 2579 2580 /* Point to next subtable */ 2581 2582 Offset += sizeof (ACPI_MSCT_PROXIMITY); 2583 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, 2584 sizeof (ACPI_MSCT_PROXIMITY)); 2585 } 2586 } 2587 2588 2589 /******************************************************************************* 2590 * 2591 * FUNCTION: AcpiDmDumpMtmr 2592 * 2593 * PARAMETERS: Table - A MTMR table 2594 * 2595 * RETURN: None 2596 * 2597 * DESCRIPTION: Format the contents of a MTMR 2598 * 2599 ******************************************************************************/ 2600 2601 void 2602 AcpiDmDumpMtmr ( 2603 ACPI_TABLE_HEADER *Table) 2604 { 2605 ACPI_STATUS Status; 2606 UINT32 Offset = sizeof (ACPI_TABLE_MTMR); 2607 ACPI_MTMR_ENTRY *SubTable; 2608 2609 2610 /* Main table */ 2611 2612 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr); 2613 if (ACPI_FAILURE (Status)) 2614 { 2615 return; 2616 } 2617 2618 /* Subtables */ 2619 2620 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); 2621 while (Offset < Table->Length) 2622 { 2623 /* Common subtable header */ 2624 2625 AcpiOsPrintf ("\n"); 2626 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2627 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0); 2628 if (ACPI_FAILURE (Status)) 2629 { 2630 return; 2631 } 2632 2633 /* Point to next subtable */ 2634 2635 Offset += sizeof (ACPI_MTMR_ENTRY); 2636 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, 2637 sizeof (ACPI_MTMR_ENTRY)); 2638 } 2639 } 2640 2641 2642 /******************************************************************************* 2643 * 2644 * FUNCTION: AcpiDmDumpNfit 2645 * 2646 * PARAMETERS: Table - A NFIT table 2647 * 2648 * RETURN: None 2649 * 2650 * DESCRIPTION: Format the contents of an NFIT. 2651 * 2652 ******************************************************************************/ 2653 2654 void 2655 AcpiDmDumpNfit ( 2656 ACPI_TABLE_HEADER *Table) 2657 { 2658 ACPI_STATUS Status; 2659 UINT32 Offset = sizeof (ACPI_TABLE_NFIT); 2660 UINT32 FieldOffset = 0; 2661 UINT32 Length; 2662 ACPI_NFIT_HEADER *SubTable; 2663 ACPI_DMTABLE_INFO *InfoTable; 2664 ACPI_NFIT_INTERLEAVE *Interleave = NULL; 2665 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; 2666 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL; 2667 UINT32 i; 2668 2669 2670 /* Main table */ 2671 2672 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit); 2673 if (ACPI_FAILURE (Status)) 2674 { 2675 return; 2676 } 2677 2678 /* Subtables */ 2679 2680 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); 2681 while (Offset < Table->Length) 2682 { 2683 /* NFIT subtable header */ 2684 2685 AcpiOsPrintf ("\n"); 2686 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2687 SubTable->Length, AcpiDmTableInfoNfitHdr); 2688 if (ACPI_FAILURE (Status)) 2689 { 2690 return; 2691 } 2692 2693 switch (SubTable->Type) 2694 { 2695 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: 2696 2697 InfoTable = AcpiDmTableInfoNfit0; 2698 break; 2699 2700 case ACPI_NFIT_TYPE_MEMORY_MAP: 2701 2702 InfoTable = AcpiDmTableInfoNfit1; 2703 break; 2704 2705 case ACPI_NFIT_TYPE_INTERLEAVE: 2706 2707 /* Has a variable number of 32-bit values at the end */ 2708 2709 InfoTable = AcpiDmTableInfoNfit2; 2710 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable); 2711 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE); 2712 break; 2713 2714 case ACPI_NFIT_TYPE_SMBIOS: 2715 2716 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable); 2717 InfoTable = AcpiDmTableInfoNfit3; 2718 break; 2719 2720 case ACPI_NFIT_TYPE_CONTROL_REGION: 2721 2722 InfoTable = AcpiDmTableInfoNfit4; 2723 break; 2724 2725 case ACPI_NFIT_TYPE_DATA_REGION: 2726 2727 InfoTable = AcpiDmTableInfoNfit5; 2728 break; 2729 2730 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 2731 2732 /* Has a variable number of 64-bit addresses at the end */ 2733 2734 InfoTable = AcpiDmTableInfoNfit6; 2735 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable); 2736 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64); 2737 break; 2738 2739 default: 2740 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", 2741 SubTable->Type); 2742 2743 /* Attempt to continue */ 2744 2745 if (!SubTable->Length) 2746 { 2747 AcpiOsPrintf ("Invalid zero length subtable\n"); 2748 return; 2749 } 2750 goto NextSubTable; 2751 } 2752 2753 AcpiOsPrintf ("\n"); 2754 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2755 SubTable->Length, InfoTable); 2756 if (ACPI_FAILURE (Status)) 2757 { 2758 return; 2759 } 2760 2761 /* Per-subtable variable-length fields */ 2762 2763 switch (SubTable->Type) 2764 { 2765 case ACPI_NFIT_TYPE_INTERLEAVE: 2766 2767 for (i = 0; i < Interleave->LineCount; i++) 2768 { 2769 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 2770 &Interleave->LineOffset[i], 2771 sizeof (UINT32), AcpiDmTableInfoNfit2a); 2772 if (ACPI_FAILURE (Status)) 2773 { 2774 return; 2775 } 2776 2777 FieldOffset += sizeof (UINT32); 2778 } 2779 break; 2780 2781 case ACPI_NFIT_TYPE_SMBIOS: 2782 2783 Length = SubTable->Length - 2784 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8); 2785 2786 if (Length) 2787 { 2788 Status = AcpiDmDumpTable (Table->Length, 2789 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8), 2790 SmbiosInfo, 2791 Length, AcpiDmTableInfoNfit3a); 2792 if (ACPI_FAILURE (Status)) 2793 { 2794 return; 2795 } 2796 } 2797 2798 break; 2799 2800 case ACPI_NFIT_TYPE_FLUSH_ADDRESS: 2801 2802 for (i = 0; i < Hint->HintCount; i++) 2803 { 2804 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset, 2805 &Hint->HintAddress[i], 2806 sizeof (UINT64), AcpiDmTableInfoNfit6a); 2807 if (ACPI_FAILURE (Status)) 2808 { 2809 return; 2810 } 2811 2812 FieldOffset += sizeof (UINT64); 2813 } 2814 break; 2815 2816 default: 2817 break; 2818 } 2819 2820 NextSubTable: 2821 /* Point to next subtable */ 2822 2823 Offset += SubTable->Length; 2824 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length); 2825 } 2826 } 2827 2828 2829 /******************************************************************************* 2830 * 2831 * FUNCTION: AcpiDmDumpPcct 2832 * 2833 * PARAMETERS: Table - A PCCT table 2834 * 2835 * RETURN: None 2836 * 2837 * DESCRIPTION: Format the contents of a PCCT. This table type consists 2838 * of an open-ended number of subtables. 2839 * 2840 ******************************************************************************/ 2841 2842 void 2843 AcpiDmDumpPcct ( 2844 ACPI_TABLE_HEADER *Table) 2845 { 2846 ACPI_STATUS Status; 2847 ACPI_PCCT_SUBSPACE *SubTable; 2848 ACPI_DMTABLE_INFO *InfoTable; 2849 UINT32 Length = Table->Length; 2850 UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 2851 2852 2853 /* Main table */ 2854 2855 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 2856 if (ACPI_FAILURE (Status)) 2857 { 2858 return; 2859 } 2860 2861 /* Subtables */ 2862 2863 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 2864 while (Offset < Table->Length) 2865 { 2866 /* Common subtable header */ 2867 2868 AcpiOsPrintf ("\n"); 2869 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2870 SubTable->Header.Length, AcpiDmTableInfoPcctHdr); 2871 if (ACPI_FAILURE (Status)) 2872 { 2873 return; 2874 } 2875 2876 switch (SubTable->Header.Type) 2877 { 2878 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 2879 2880 InfoTable = AcpiDmTableInfoPcct0; 2881 break; 2882 2883 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 2884 2885 InfoTable = AcpiDmTableInfoPcct1; 2886 break; 2887 2888 default: 2889 2890 AcpiOsPrintf ( 2891 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", 2892 SubTable->Header.Type); 2893 return; 2894 } 2895 2896 AcpiOsPrintf ("\n"); 2897 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2898 SubTable->Header.Length, InfoTable); 2899 if (ACPI_FAILURE (Status)) 2900 { 2901 return; 2902 } 2903 2904 /* Point to next subtable */ 2905 2906 Offset += SubTable->Header.Length; 2907 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, 2908 SubTable->Header.Length); 2909 } 2910 } 2911 2912 2913 /******************************************************************************* 2914 * 2915 * FUNCTION: AcpiDmDumpPmtt 2916 * 2917 * PARAMETERS: Table - A PMTT table 2918 * 2919 * RETURN: None 2920 * 2921 * DESCRIPTION: Format the contents of a PMTT. This table type consists 2922 * of an open-ended number of subtables. 2923 * 2924 ******************************************************************************/ 2925 2926 void 2927 AcpiDmDumpPmtt ( 2928 ACPI_TABLE_HEADER *Table) 2929 { 2930 ACPI_STATUS Status; 2931 ACPI_PMTT_HEADER *SubTable; 2932 ACPI_PMTT_HEADER *MemSubTable; 2933 ACPI_PMTT_HEADER *DimmSubTable; 2934 ACPI_PMTT_DOMAIN *DomainArray; 2935 UINT32 Length = Table->Length; 2936 UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 2937 UINT32 MemOffset; 2938 UINT32 DimmOffset; 2939 UINT32 DomainOffset; 2940 UINT32 DomainCount; 2941 2942 2943 /* Main table */ 2944 2945 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 2946 if (ACPI_FAILURE (Status)) 2947 { 2948 return; 2949 } 2950 2951 /* Subtables */ 2952 2953 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 2954 while (Offset < Table->Length) 2955 { 2956 /* Common subtable header */ 2957 2958 AcpiOsPrintf ("\n"); 2959 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2960 SubTable->Length, AcpiDmTableInfoPmttHdr); 2961 if (ACPI_FAILURE (Status)) 2962 { 2963 return; 2964 } 2965 2966 /* Only Socket subtables are expected at this level */ 2967 2968 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) 2969 { 2970 AcpiOsPrintf ( 2971 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2972 SubTable->Type); 2973 return; 2974 } 2975 2976 /* Dump the fixed-length portion of the subtable */ 2977 2978 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2979 SubTable->Length, AcpiDmTableInfoPmtt0); 2980 if (ACPI_FAILURE (Status)) 2981 { 2982 return; 2983 } 2984 2985 /* Walk the memory controller subtables */ 2986 2987 MemOffset = sizeof (ACPI_PMTT_SOCKET); 2988 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, 2989 sizeof (ACPI_PMTT_SOCKET)); 2990 2991 while (((Offset + MemOffset) < Table->Length) && 2992 (MemOffset < SubTable->Length)) 2993 { 2994 /* Common subtable header */ 2995 2996 AcpiOsPrintf ("\n"); 2997 Status = AcpiDmDumpTable (Length, 2998 Offset + MemOffset, MemSubTable, 2999 MemSubTable->Length, AcpiDmTableInfoPmttHdr); 3000 if (ACPI_FAILURE (Status)) 3001 { 3002 return; 3003 } 3004 3005 /* Only memory controller subtables are expected at this level */ 3006 3007 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) 3008 { 3009 AcpiOsPrintf ( 3010 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 3011 MemSubTable->Type); 3012 return; 3013 } 3014 3015 /* Dump the fixed-length portion of the controller subtable */ 3016 3017 Status = AcpiDmDumpTable (Length, 3018 Offset + MemOffset, MemSubTable, 3019 MemSubTable->Length, AcpiDmTableInfoPmtt1); 3020 if (ACPI_FAILURE (Status)) 3021 { 3022 return; 3023 } 3024 3025 /* Walk the variable count of proximity domains */ 3026 3027 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; 3028 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 3029 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, 3030 sizeof (ACPI_PMTT_CONTROLLER)); 3031 3032 while (((Offset + MemOffset + DomainOffset) < Table->Length) && 3033 ((MemOffset + DomainOffset) < SubTable->Length) && 3034 DomainCount) 3035 { 3036 Status = AcpiDmDumpTable (Length, 3037 Offset + MemOffset + DomainOffset, DomainArray, 3038 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 3039 if (ACPI_FAILURE (Status)) 3040 { 3041 return; 3042 } 3043 3044 DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 3045 DomainArray++; 3046 DomainCount--; 3047 } 3048 3049 if (DomainCount) 3050 { 3051 AcpiOsPrintf ( 3052 "\n**** DomainCount exceeds subtable length\n\n"); 3053 } 3054 3055 /* Walk the physical component (DIMM) subtables */ 3056 3057 DimmOffset = DomainOffset; 3058 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, 3059 DomainOffset); 3060 3061 while (((Offset + MemOffset + DimmOffset) < Table->Length) && 3062 (DimmOffset < MemSubTable->Length)) 3063 { 3064 /* Common subtable header */ 3065 3066 AcpiOsPrintf ("\n"); 3067 Status = AcpiDmDumpTable (Length, 3068 Offset + MemOffset + DimmOffset, DimmSubTable, 3069 DimmSubTable->Length, AcpiDmTableInfoPmttHdr); 3070 if (ACPI_FAILURE (Status)) 3071 { 3072 return; 3073 } 3074 3075 /* Only DIMM subtables are expected at this level */ 3076 3077 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) 3078 { 3079 AcpiOsPrintf ( 3080 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 3081 DimmSubTable->Type); 3082 return; 3083 } 3084 3085 /* Dump the fixed-length DIMM subtable */ 3086 3087 Status = AcpiDmDumpTable (Length, 3088 Offset + MemOffset + DimmOffset, DimmSubTable, 3089 DimmSubTable->Length, AcpiDmTableInfoPmtt2); 3090 if (ACPI_FAILURE (Status)) 3091 { 3092 return; 3093 } 3094 3095 /* Point to next DIMM subtable */ 3096 3097 DimmOffset += DimmSubTable->Length; 3098 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3099 DimmSubTable, DimmSubTable->Length); 3100 } 3101 3102 /* Point to next Controller subtable */ 3103 3104 MemOffset += MemSubTable->Length; 3105 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3106 MemSubTable, MemSubTable->Length); 3107 } 3108 3109 /* Point to next Socket subtable */ 3110 3111 Offset += SubTable->Length; 3112 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 3113 SubTable, SubTable->Length); 3114 } 3115 } 3116 3117 3118 /******************************************************************************* 3119 * 3120 * FUNCTION: AcpiDmDumpS3pt 3121 * 3122 * PARAMETERS: Table - A S3PT table 3123 * 3124 * RETURN: Length of the table 3125 * 3126 * DESCRIPTION: Format the contents of a S3PT 3127 * 3128 ******************************************************************************/ 3129 3130 UINT32 3131 AcpiDmDumpS3pt ( 3132 ACPI_TABLE_HEADER *Tables) 3133 { 3134 ACPI_STATUS Status; 3135 UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 3136 ACPI_S3PT_HEADER *SubTable; 3137 ACPI_DMTABLE_INFO *InfoTable; 3138 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 3139 3140 3141 /* Main table */ 3142 3143 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 3144 if (ACPI_FAILURE (Status)) 3145 { 3146 return 0; 3147 } 3148 3149 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset); 3150 while (Offset < S3ptTable->Length) 3151 { 3152 /* Common subtable header */ 3153 3154 AcpiOsPrintf ("\n"); 3155 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 3156 SubTable->Length, AcpiDmTableInfoS3ptHdr); 3157 if (ACPI_FAILURE (Status)) 3158 { 3159 return 0; 3160 } 3161 3162 switch (SubTable->Type) 3163 { 3164 case ACPI_S3PT_TYPE_RESUME: 3165 3166 InfoTable = AcpiDmTableInfoS3pt0; 3167 break; 3168 3169 case ACPI_S3PT_TYPE_SUSPEND: 3170 3171 InfoTable = AcpiDmTableInfoS3pt1; 3172 break; 3173 3174 default: 3175 3176 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", 3177 SubTable->Type); 3178 3179 /* Attempt to continue */ 3180 3181 if (!SubTable->Length) 3182 { 3183 AcpiOsPrintf ("Invalid zero length subtable\n"); 3184 return 0; 3185 } 3186 goto NextSubTable; 3187 } 3188 3189 AcpiOsPrintf ("\n"); 3190 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 3191 SubTable->Length, InfoTable); 3192 if (ACPI_FAILURE (Status)) 3193 { 3194 return 0; 3195 } 3196 3197 NextSubTable: 3198 /* Point to next subtable */ 3199 3200 Offset += SubTable->Length; 3201 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length); 3202 } 3203 3204 return (S3ptTable->Length); 3205 } 3206 3207 3208 /******************************************************************************* 3209 * 3210 * FUNCTION: AcpiDmDumpSlic 3211 * 3212 * PARAMETERS: Table - A SLIC table 3213 * 3214 * RETURN: None 3215 * 3216 * DESCRIPTION: Format the contents of a SLIC 3217 * 3218 ******************************************************************************/ 3219 3220 void 3221 AcpiDmDumpSlic ( 3222 ACPI_TABLE_HEADER *Table) 3223 { 3224 3225 (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table, 3226 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic); 3227 } 3228 3229 3230 /******************************************************************************* 3231 * 3232 * FUNCTION: AcpiDmDumpSlit 3233 * 3234 * PARAMETERS: Table - An SLIT 3235 * 3236 * RETURN: None 3237 * 3238 * DESCRIPTION: Format the contents of a SLIT 3239 * 3240 ******************************************************************************/ 3241 3242 void 3243 AcpiDmDumpSlit ( 3244 ACPI_TABLE_HEADER *Table) 3245 { 3246 ACPI_STATUS Status; 3247 UINT32 Offset; 3248 UINT8 *Row; 3249 UINT32 Localities; 3250 UINT32 i; 3251 UINT32 j; 3252 3253 3254 /* Main table */ 3255 3256 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 3257 if (ACPI_FAILURE (Status)) 3258 { 3259 return; 3260 } 3261 3262 /* Display the Locality NxN Matrix */ 3263 3264 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 3265 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 3266 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 3267 3268 for (i = 0; i < Localities; i++) 3269 { 3270 /* Display one row of the matrix */ 3271 3272 AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 3273 for (j = 0; j < Localities; j++) 3274 { 3275 /* Check for beyond EOT */ 3276 3277 if (Offset >= Table->Length) 3278 { 3279 AcpiOsPrintf ( 3280 "\n**** Not enough room in table for all localities\n"); 3281 return; 3282 } 3283 3284 AcpiOsPrintf ("%2.2X", Row[j]); 3285 Offset++; 3286 3287 /* Display up to 16 bytes per output row */ 3288 3289 if ((j+1) < Localities) 3290 { 3291 AcpiOsPrintf (" "); 3292 3293 if (j && (((j+1) % 16) == 0)) 3294 { 3295 AcpiOsPrintf ("\\\n"); /* With line continuation char */ 3296 AcpiDmLineHeader (Offset, 0, NULL); 3297 } 3298 } 3299 } 3300 3301 /* Point to next row */ 3302 3303 AcpiOsPrintf ("\n"); 3304 Row += Localities; 3305 } 3306 } 3307 3308 3309 /******************************************************************************* 3310 * 3311 * FUNCTION: AcpiDmDumpSrat 3312 * 3313 * PARAMETERS: Table - A SRAT table 3314 * 3315 * RETURN: None 3316 * 3317 * DESCRIPTION: Format the contents of a SRAT 3318 * 3319 ******************************************************************************/ 3320 3321 void 3322 AcpiDmDumpSrat ( 3323 ACPI_TABLE_HEADER *Table) 3324 { 3325 ACPI_STATUS Status; 3326 UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 3327 ACPI_SUBTABLE_HEADER *SubTable; 3328 ACPI_DMTABLE_INFO *InfoTable; 3329 3330 3331 /* Main table */ 3332 3333 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 3334 if (ACPI_FAILURE (Status)) 3335 { 3336 return; 3337 } 3338 3339 /* Subtables */ 3340 3341 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 3342 while (Offset < Table->Length) 3343 { 3344 /* Common subtable header */ 3345 3346 AcpiOsPrintf ("\n"); 3347 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3348 SubTable->Length, AcpiDmTableInfoSratHdr); 3349 if (ACPI_FAILURE (Status)) 3350 { 3351 return; 3352 } 3353 3354 switch (SubTable->Type) 3355 { 3356 case ACPI_SRAT_TYPE_CPU_AFFINITY: 3357 3358 InfoTable = AcpiDmTableInfoSrat0; 3359 break; 3360 3361 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 3362 3363 InfoTable = AcpiDmTableInfoSrat1; 3364 break; 3365 3366 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 3367 3368 InfoTable = AcpiDmTableInfoSrat2; 3369 break; 3370 3371 case ACPI_SRAT_TYPE_GICC_AFFINITY: 3372 3373 InfoTable = AcpiDmTableInfoSrat3; 3374 break; 3375 3376 default: 3377 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", 3378 SubTable->Type); 3379 3380 /* Attempt to continue */ 3381 3382 if (!SubTable->Length) 3383 { 3384 AcpiOsPrintf ("Invalid zero length subtable\n"); 3385 return; 3386 } 3387 goto NextSubTable; 3388 } 3389 3390 AcpiOsPrintf ("\n"); 3391 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3392 SubTable->Length, InfoTable); 3393 if (ACPI_FAILURE (Status)) 3394 { 3395 return; 3396 } 3397 3398 NextSubTable: 3399 /* Point to next subtable */ 3400 3401 Offset += SubTable->Length; 3402 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, 3403 SubTable->Length); 3404 } 3405 } 3406 3407 3408 /******************************************************************************* 3409 * 3410 * FUNCTION: AcpiDmDumpStao 3411 * 3412 * PARAMETERS: Table - A STAO table 3413 * 3414 * RETURN: None 3415 * 3416 * DESCRIPTION: Format the contents of a STAO. This is a variable-length 3417 * table that contains an open-ended number of ASCII strings 3418 * at the end of the table. 3419 * 3420 ******************************************************************************/ 3421 3422 void 3423 AcpiDmDumpStao ( 3424 ACPI_TABLE_HEADER *Table) 3425 { 3426 ACPI_STATUS Status; 3427 char *Namepath; 3428 UINT32 Length = Table->Length; 3429 UINT32 StringLength; 3430 UINT32 Offset = sizeof (ACPI_TABLE_STAO); 3431 3432 3433 /* Main table */ 3434 3435 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao); 3436 if (ACPI_FAILURE (Status)) 3437 { 3438 return; 3439 } 3440 3441 /* The rest of the table consists of Namepath strings */ 3442 3443 while (Offset < Table->Length) 3444 { 3445 Namepath = ACPI_ADD_PTR (char, Table, Offset); 3446 StringLength = strlen (Namepath) + 1; 3447 3448 AcpiDmLineHeader (Offset, StringLength, "Namestring"); 3449 AcpiOsPrintf ("\"%s\"\n", Namepath); 3450 3451 /* Point to next namepath */ 3452 3453 Offset += StringLength; 3454 } 3455 } 3456 3457 3458 /******************************************************************************* 3459 * 3460 * FUNCTION: AcpiDmDumpTcpa 3461 * 3462 * PARAMETERS: Table - A TCPA table 3463 * 3464 * RETURN: None 3465 * 3466 * DESCRIPTION: Format the contents of a TCPA. 3467 * 3468 * NOTE: There are two versions of the table with the same signature: 3469 * the client version and the server version. The common 3470 * PlatformClass field is used to differentiate the two types of 3471 * tables. 3472 * 3473 ******************************************************************************/ 3474 3475 void 3476 AcpiDmDumpTcpa ( 3477 ACPI_TABLE_HEADER *Table) 3478 { 3479 UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR); 3480 ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR ( 3481 ACPI_TABLE_TCPA_HDR, Table); 3482 ACPI_TABLE_TCPA_HDR *SubTable = ACPI_ADD_PTR ( 3483 ACPI_TABLE_TCPA_HDR, Table, Offset); 3484 ACPI_STATUS Status; 3485 3486 3487 /* Main table */ 3488 3489 Status = AcpiDmDumpTable (Table->Length, 0, Table, 3490 0, AcpiDmTableInfoTcpaHdr); 3491 if (ACPI_FAILURE (Status)) 3492 { 3493 return; 3494 } 3495 3496 /* 3497 * Examine the PlatformClass field to determine the table type. 3498 * Either a client or server table. Only one. 3499 */ 3500 switch (CommonHeader->PlatformClass) 3501 { 3502 case ACPI_TCPA_CLIENT_TABLE: 3503 3504 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3505 Table->Length - Offset, AcpiDmTableInfoTcpaClient); 3506 break; 3507 3508 case ACPI_TCPA_SERVER_TABLE: 3509 3510 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3511 Table->Length - Offset, AcpiDmTableInfoTcpaServer); 3512 break; 3513 3514 default: 3515 3516 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 3517 CommonHeader->PlatformClass); 3518 Status = AE_ERROR; 3519 break; 3520 } 3521 3522 if (ACPI_FAILURE (Status)) 3523 { 3524 AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n"); 3525 } 3526 } 3527 3528 3529 /******************************************************************************* 3530 * 3531 * FUNCTION: AcpiDmDumpVrtc 3532 * 3533 * PARAMETERS: Table - A VRTC table 3534 * 3535 * RETURN: None 3536 * 3537 * DESCRIPTION: Format the contents of a VRTC 3538 * 3539 ******************************************************************************/ 3540 3541 void 3542 AcpiDmDumpVrtc ( 3543 ACPI_TABLE_HEADER *Table) 3544 { 3545 ACPI_STATUS Status; 3546 UINT32 Offset = sizeof (ACPI_TABLE_VRTC); 3547 ACPI_VRTC_ENTRY *SubTable; 3548 3549 3550 /* Main table */ 3551 3552 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc); 3553 if (ACPI_FAILURE (Status)) 3554 { 3555 return; 3556 } 3557 3558 /* Subtables */ 3559 3560 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); 3561 while (Offset < Table->Length) 3562 { 3563 /* Common subtable header */ 3564 3565 AcpiOsPrintf ("\n"); 3566 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3567 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0); 3568 if (ACPI_FAILURE (Status)) 3569 { 3570 return; 3571 } 3572 3573 /* Point to next subtable */ 3574 3575 Offset += sizeof (ACPI_VRTC_ENTRY); 3576 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, 3577 sizeof (ACPI_VRTC_ENTRY)); 3578 } 3579 } 3580 3581 3582 /******************************************************************************* 3583 * 3584 * FUNCTION: AcpiDmDumpWdat 3585 * 3586 * PARAMETERS: Table - A WDAT table 3587 * 3588 * RETURN: None 3589 * 3590 * DESCRIPTION: Format the contents of a WDAT 3591 * 3592 ******************************************************************************/ 3593 3594 void 3595 AcpiDmDumpWdat ( 3596 ACPI_TABLE_HEADER *Table) 3597 { 3598 ACPI_STATUS Status; 3599 UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 3600 ACPI_WDAT_ENTRY *SubTable; 3601 3602 3603 /* Main table */ 3604 3605 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 3606 if (ACPI_FAILURE (Status)) 3607 { 3608 return; 3609 } 3610 3611 /* Subtables */ 3612 3613 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 3614 while (Offset < Table->Length) 3615 { 3616 /* Common subtable header */ 3617 3618 AcpiOsPrintf ("\n"); 3619 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 3620 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 3621 if (ACPI_FAILURE (Status)) 3622 { 3623 return; 3624 } 3625 3626 /* Point to next subtable */ 3627 3628 Offset += sizeof (ACPI_WDAT_ENTRY); 3629 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, 3630 sizeof (ACPI_WDAT_ENTRY)); 3631 } 3632 } 3633 3634 3635 /******************************************************************************* 3636 * 3637 * FUNCTION: AcpiDmDumpWpbt 3638 * 3639 * PARAMETERS: Table - A WPBT table 3640 * 3641 * RETURN: None 3642 * 3643 * DESCRIPTION: Format the contents of a WPBT. This table type consists 3644 * of an open-ended arguments buffer at the end of the table. 3645 * 3646 ******************************************************************************/ 3647 3648 void 3649 AcpiDmDumpWpbt ( 3650 ACPI_TABLE_HEADER *Table) 3651 { 3652 ACPI_STATUS Status; 3653 ACPI_TABLE_WPBT *SubTable; 3654 UINT32 Length = Table->Length; 3655 UINT16 ArgumentsLength; 3656 3657 3658 /* Dump the main table */ 3659 3660 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt); 3661 if (ACPI_FAILURE (Status)) 3662 { 3663 return; 3664 } 3665 3666 /* Extract the arguments buffer length from the main table */ 3667 3668 SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); 3669 ArgumentsLength = SubTable->ArgumentsLength; 3670 3671 /* Dump the arguments buffer */ 3672 3673 (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength, 3674 AcpiDmTableInfoWpbt0); 3675 } 3676