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 <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 /* 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 * MultiLine - TRUE if a large, multi-line buffer 74 * 75 * RETURN: None 76 * 77 * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the 78 * disassembler output format.) 79 * 80 ******************************************************************************/ 81 82 void 83 AcpiDmDumpBuffer ( 84 void *Table, 85 UINT32 BufferOffset, 86 UINT32 Length, 87 UINT32 AbsoluteOffset, 88 char *Header, 89 BOOLEAN MultiLine) 90 { 91 UINT8 *Buffer; 92 UINT32 i; 93 94 95 if (!Length) 96 { 97 return; 98 } 99 100 Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset; 101 i = 0; 102 103 while (i < Length) 104 { 105 if (!(i % 16)) 106 { 107 if (MultiLine) 108 { 109 /* Insert a backslash - line continuation character */ 110 111 AcpiOsPrintf ("\\\n "); 112 } 113 else 114 { 115 AcpiOsPrintf ("\n"); 116 AcpiDmLineHeader (AbsoluteOffset, 117 ((Length - i) > 16) ? 16 : (Length - i), Header); 118 Header = NULL; 119 } 120 } 121 122 AcpiOsPrintf ("%.02X ", *Buffer); 123 i++; 124 Buffer++; 125 AbsoluteOffset++; 126 } 127 128 AcpiOsPrintf ("\n"); 129 } 130 131 132 /******************************************************************************* 133 * 134 * FUNCTION: AcpiDmDumpRsdp 135 * 136 * PARAMETERS: Table - A RSDP 137 * 138 * RETURN: Length of the table (there is not always a length field, 139 * use revision or length if available (ACPI 2.0+)) 140 * 141 * DESCRIPTION: Format the contents of a RSDP 142 * 143 ******************************************************************************/ 144 145 UINT32 146 AcpiDmDumpRsdp ( 147 ACPI_TABLE_HEADER *Table) 148 { 149 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table); 150 UINT32 Length = sizeof (ACPI_RSDP_COMMON); 151 UINT8 Checksum; 152 153 154 /* Dump the common ACPI 1.0 portion */ 155 156 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1); 157 158 /* Validate the first checksum */ 159 160 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), 161 Rsdp->Checksum); 162 if (Checksum != Rsdp->Checksum) 163 { 164 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n", 165 Checksum); 166 } 167 168 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */ 169 170 if (Rsdp->Revision > 0) 171 { 172 Length = Rsdp->Length; 173 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2); 174 175 /* Validate the extended checksum over entire RSDP */ 176 177 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), 178 Rsdp->ExtendedChecksum); 179 if (Checksum != Rsdp->ExtendedChecksum) 180 { 181 AcpiOsPrintf ( 182 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n", 183 Checksum); 184 } 185 } 186 187 return (Length); 188 } 189 190 191 /******************************************************************************* 192 * 193 * FUNCTION: AcpiDmDumpRsdt 194 * 195 * PARAMETERS: Table - A RSDT 196 * 197 * RETURN: None 198 * 199 * DESCRIPTION: Format the contents of a RSDT 200 * 201 ******************************************************************************/ 202 203 void 204 AcpiDmDumpRsdt ( 205 ACPI_TABLE_HEADER *Table) 206 { 207 UINT32 *Array; 208 UINT32 Entries; 209 UINT32 Offset; 210 UINT32 i; 211 212 213 /* Point to start of table pointer array */ 214 215 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry; 216 Offset = sizeof (ACPI_TABLE_HEADER); 217 218 /* RSDT uses 32-bit pointers */ 219 220 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32); 221 222 for (i = 0; i < Entries; i++) 223 { 224 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i); 225 AcpiOsPrintf ("%8.8X\n", Array[i]); 226 Offset += sizeof (UINT32); 227 } 228 } 229 230 231 /******************************************************************************* 232 * 233 * FUNCTION: AcpiDmDumpXsdt 234 * 235 * PARAMETERS: Table - A XSDT 236 * 237 * RETURN: None 238 * 239 * DESCRIPTION: Format the contents of a XSDT 240 * 241 ******************************************************************************/ 242 243 void 244 AcpiDmDumpXsdt ( 245 ACPI_TABLE_HEADER *Table) 246 { 247 UINT64 *Array; 248 UINT32 Entries; 249 UINT32 Offset; 250 UINT32 i; 251 252 253 /* Point to start of table pointer array */ 254 255 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry; 256 Offset = sizeof (ACPI_TABLE_HEADER); 257 258 /* XSDT uses 64-bit pointers */ 259 260 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64); 261 262 for (i = 0; i < Entries; i++) 263 { 264 AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i); 265 AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i])); 266 Offset += sizeof (UINT64); 267 } 268 } 269 270 271 /******************************************************************************* 272 * 273 * FUNCTION: AcpiDmDumpFadt 274 * 275 * PARAMETERS: Table - A FADT 276 * 277 * RETURN: None 278 * 279 * DESCRIPTION: Format the contents of a FADT 280 * 281 * NOTE: We cannot depend on the FADT version to indicate the actual 282 * contents of the FADT because of BIOS bugs. The table length 283 * is the only reliable indicator. 284 * 285 ******************************************************************************/ 286 287 void 288 AcpiDmDumpFadt ( 289 ACPI_TABLE_HEADER *Table) 290 { 291 292 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */ 293 294 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1); 295 296 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */ 297 298 if ((Table->Length > ACPI_FADT_V1_SIZE) && 299 (Table->Length <= ACPI_FADT_V2_SIZE)) 300 { 301 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2); 302 } 303 304 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */ 305 306 else if (Table->Length > ACPI_FADT_V2_SIZE) 307 { 308 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3); 309 310 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */ 311 312 if (Table->Length > ACPI_FADT_V3_SIZE) 313 { 314 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5); 315 } 316 } 317 318 /* Validate various fields in the FADT, including length */ 319 320 AcpiTbCreateLocalFadt (Table, Table->Length); 321 322 /* Validate FADT length against the revision */ 323 324 AcpiDmValidateFadtLength (Table->Revision, Table->Length); 325 } 326 327 328 /******************************************************************************* 329 * 330 * FUNCTION: AcpiDmValidateFadtLength 331 * 332 * PARAMETERS: Revision - FADT revision (Header->Revision) 333 * Length - FADT length (Header->Length 334 * 335 * RETURN: None 336 * 337 * DESCRIPTION: Check the FADT revision against the expected table length for 338 * that revision. Issue a warning if the length is not what was 339 * expected. This seems to be such a common BIOS bug that the 340 * FADT revision has been rendered virtually meaningless. 341 * 342 ******************************************************************************/ 343 344 static void 345 AcpiDmValidateFadtLength ( 346 UINT32 Revision, 347 UINT32 Length) 348 { 349 UINT32 ExpectedLength; 350 351 352 switch (Revision) 353 { 354 case 0: 355 356 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); 357 return; 358 359 case 1: 360 361 ExpectedLength = ACPI_FADT_V1_SIZE; 362 break; 363 364 case 2: 365 366 ExpectedLength = ACPI_FADT_V2_SIZE; 367 break; 368 369 case 3: 370 case 4: 371 372 ExpectedLength = ACPI_FADT_V3_SIZE; 373 break; 374 375 case 5: 376 377 ExpectedLength = ACPI_FADT_V5_SIZE; 378 break; 379 380 default: 381 382 return; 383 } 384 385 if (Length == ExpectedLength) 386 { 387 return; 388 } 389 390 AcpiOsPrintf ( 391 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n", 392 Revision, Length, ExpectedLength); 393 } 394 395 396 /******************************************************************************* 397 * 398 * FUNCTION: AcpiDmDumpAsf 399 * 400 * PARAMETERS: Table - A ASF table 401 * 402 * RETURN: None 403 * 404 * DESCRIPTION: Format the contents of a ASF table 405 * 406 ******************************************************************************/ 407 408 void 409 AcpiDmDumpAsf ( 410 ACPI_TABLE_HEADER *Table) 411 { 412 ACPI_STATUS Status; 413 UINT32 Offset = sizeof (ACPI_TABLE_HEADER); 414 ACPI_ASF_INFO *SubTable; 415 ACPI_DMTABLE_INFO *InfoTable; 416 ACPI_DMTABLE_INFO *DataInfoTable = NULL; 417 UINT8 *DataTable = NULL; 418 UINT32 DataCount = 0; 419 UINT32 DataLength = 0; 420 UINT32 DataOffset = 0; 421 UINT32 i; 422 UINT8 Type; 423 424 425 /* No main table, only subtables */ 426 427 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); 428 while (Offset < Table->Length) 429 { 430 /* Common subtable header */ 431 432 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 433 SubTable->Header.Length, AcpiDmTableInfoAsfHdr); 434 if (ACPI_FAILURE (Status)) 435 { 436 return; 437 } 438 439 /* The actual type is the lower 7 bits of Type */ 440 441 Type = (UINT8) (SubTable->Header.Type & 0x7F); 442 443 switch (Type) 444 { 445 case ACPI_ASF_TYPE_INFO: 446 447 InfoTable = AcpiDmTableInfoAsf0; 448 break; 449 450 case ACPI_ASF_TYPE_ALERT: 451 452 InfoTable = AcpiDmTableInfoAsf1; 453 DataInfoTable = AcpiDmTableInfoAsf1a; 454 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); 455 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; 456 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; 457 DataOffset = Offset + sizeof (ACPI_ASF_ALERT); 458 break; 459 460 case ACPI_ASF_TYPE_CONTROL: 461 462 InfoTable = AcpiDmTableInfoAsf2; 463 DataInfoTable = AcpiDmTableInfoAsf2a; 464 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); 465 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; 466 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; 467 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); 468 break; 469 470 case ACPI_ASF_TYPE_BOOT: 471 472 InfoTable = AcpiDmTableInfoAsf3; 473 break; 474 475 case ACPI_ASF_TYPE_ADDRESS: 476 477 InfoTable = AcpiDmTableInfoAsf4; 478 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); 479 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; 480 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); 481 break; 482 483 default: 484 485 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", SubTable->Header.Type); 486 return; 487 } 488 489 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 490 SubTable->Header.Length, InfoTable); 491 if (ACPI_FAILURE (Status)) 492 { 493 return; 494 } 495 496 /* Dump variable-length extra data */ 497 498 switch (Type) 499 { 500 case ACPI_ASF_TYPE_ALERT: 501 case ACPI_ASF_TYPE_CONTROL: 502 503 for (i = 0; i < DataCount; i++) 504 { 505 AcpiOsPrintf ("\n"); 506 Status = AcpiDmDumpTable (Table->Length, DataOffset, 507 DataTable, DataLength, DataInfoTable); 508 if (ACPI_FAILURE (Status)) 509 { 510 return; 511 } 512 513 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength); 514 DataOffset += DataLength; 515 } 516 break; 517 518 case ACPI_ASF_TYPE_ADDRESS: 519 520 for (i = 0; i < DataLength; i++) 521 { 522 if (!(i % 16)) 523 { 524 AcpiDmLineHeader (DataOffset, 1, "Addresses"); 525 } 526 527 AcpiOsPrintf ("%2.2X ", *DataTable); 528 DataTable++; 529 DataOffset++; 530 if (DataOffset > Table->Length) 531 { 532 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure! (ASF! table)\n"); 533 return; 534 } 535 } 536 537 AcpiOsPrintf ("\n"); 538 break; 539 540 default: 541 542 break; 543 } 544 545 AcpiOsPrintf ("\n"); 546 547 /* Point to next subtable */ 548 549 if (!SubTable->Header.Length) 550 { 551 AcpiOsPrintf ("Invalid zero subtable header length\n"); 552 return; 553 } 554 555 Offset += SubTable->Header.Length; 556 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length); 557 } 558 } 559 560 561 /******************************************************************************* 562 * 563 * FUNCTION: AcpiDmDumpCpep 564 * 565 * PARAMETERS: Table - A CPEP table 566 * 567 * RETURN: None 568 * 569 * DESCRIPTION: Format the contents of a CPEP. This table type consists 570 * of an open-ended number of subtables. 571 * 572 ******************************************************************************/ 573 574 void 575 AcpiDmDumpCpep ( 576 ACPI_TABLE_HEADER *Table) 577 { 578 ACPI_STATUS Status; 579 ACPI_CPEP_POLLING *SubTable; 580 UINT32 Length = Table->Length; 581 UINT32 Offset = sizeof (ACPI_TABLE_CPEP); 582 583 584 /* Main table */ 585 586 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep); 587 if (ACPI_FAILURE (Status)) 588 { 589 return; 590 } 591 592 /* Subtables */ 593 594 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); 595 while (Offset < Table->Length) 596 { 597 AcpiOsPrintf ("\n"); 598 Status = AcpiDmDumpTable (Length, Offset, SubTable, 599 SubTable->Header.Length, AcpiDmTableInfoCpep0); 600 if (ACPI_FAILURE (Status)) 601 { 602 return; 603 } 604 605 /* Point to next subtable */ 606 607 Offset += SubTable->Header.Length; 608 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, 609 SubTable->Header.Length); 610 } 611 } 612 613 614 /******************************************************************************* 615 * 616 * FUNCTION: AcpiDmDumpCsrt 617 * 618 * PARAMETERS: Table - A CSRT table 619 * 620 * RETURN: None 621 * 622 * DESCRIPTION: Format the contents of a CSRT. This table type consists 623 * of an open-ended number of subtables. 624 * 625 ******************************************************************************/ 626 627 void 628 AcpiDmDumpCsrt ( 629 ACPI_TABLE_HEADER *Table) 630 { 631 ACPI_STATUS Status; 632 ACPI_CSRT_GROUP *SubTable; 633 ACPI_CSRT_SHARED_INFO *SharedInfoTable; 634 ACPI_CSRT_DESCRIPTOR *SubSubTable; 635 UINT32 Length = Table->Length; 636 UINT32 Offset = sizeof (ACPI_TABLE_CSRT); 637 UINT32 SubOffset; 638 UINT32 SubSubOffset; 639 UINT32 InfoLength; 640 641 642 /* The main table only contains the ACPI header, thus already handled */ 643 644 /* Subtables (Resource Groups) */ 645 646 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); 647 while (Offset < Table->Length) 648 { 649 /* Resource group subtable */ 650 651 AcpiOsPrintf ("\n"); 652 Status = AcpiDmDumpTable (Length, Offset, SubTable, 653 SubTable->Length, AcpiDmTableInfoCsrt0); 654 if (ACPI_FAILURE (Status)) 655 { 656 return; 657 } 658 659 /* Shared info subtable (One per resource group) */ 660 661 SubOffset = sizeof (ACPI_CSRT_GROUP); 662 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table, 663 Offset + SubOffset); 664 665 AcpiOsPrintf ("\n"); 666 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable, 667 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1); 668 if (ACPI_FAILURE (Status)) 669 { 670 return; 671 } 672 673 SubOffset += SubTable->SharedInfoLength; 674 675 /* Sub-Subtables (Resource Descriptors) */ 676 677 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, 678 Offset + SubOffset); 679 680 while ((SubOffset < SubTable->Length) && 681 ((Offset + SubOffset) < Table->Length)) 682 { 683 AcpiOsPrintf ("\n"); 684 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable, 685 SubSubTable->Length, AcpiDmTableInfoCsrt2); 686 if (ACPI_FAILURE (Status)) 687 { 688 return; 689 } 690 691 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR); 692 693 /* Resource-specific info buffer */ 694 695 InfoLength = SubSubTable->Length - SubSubOffset; 696 697 AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength, 698 Offset + SubOffset + SubSubOffset, "ResourceInfo", FALSE); 699 SubSubOffset += InfoLength; 700 701 /* Point to next sub-subtable */ 702 703 SubOffset += SubSubTable->Length; 704 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable, 705 SubSubTable->Length); 706 } 707 708 /* Point to next subtable */ 709 710 Offset += SubTable->Length; 711 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable, 712 SubTable->Length); 713 } 714 } 715 716 717 /******************************************************************************* 718 * 719 * FUNCTION: AcpiDmDumpDbg2 720 * 721 * PARAMETERS: Table - A DBG2 table 722 * 723 * RETURN: None 724 * 725 * DESCRIPTION: Format the contents of a DBG2. This table type consists 726 * of an open-ended number of subtables. 727 * 728 ******************************************************************************/ 729 730 void 731 AcpiDmDumpDbg2 ( 732 ACPI_TABLE_HEADER *Table) 733 { 734 ACPI_STATUS Status; 735 ACPI_DBG2_DEVICE *SubTable; 736 UINT32 Length = Table->Length; 737 UINT32 Offset = sizeof (ACPI_TABLE_DBG2); 738 UINT32 i; 739 UINT32 ArrayOffset; 740 UINT32 AbsoluteOffset; 741 UINT8 *Array; 742 743 744 /* Main table */ 745 746 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2); 747 if (ACPI_FAILURE (Status)) 748 { 749 return; 750 } 751 752 /* Subtables */ 753 754 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); 755 while (Offset < Table->Length) 756 { 757 AcpiOsPrintf ("\n"); 758 Status = AcpiDmDumpTable (Length, Offset, SubTable, 759 SubTable->Length, AcpiDmTableInfoDbg2Device); 760 if (ACPI_FAILURE (Status)) 761 { 762 return; 763 } 764 765 /* Dump the BaseAddress array */ 766 767 for (i = 0; i < SubTable->RegisterCount; i++) 768 { 769 ArrayOffset = SubTable->BaseAddressOffset + 770 (sizeof (ACPI_GENERIC_ADDRESS) * i); 771 AbsoluteOffset = Offset + ArrayOffset; 772 Array = (UINT8 *) SubTable + ArrayOffset; 773 774 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 775 SubTable->Length, AcpiDmTableInfoDbg2Addr); 776 if (ACPI_FAILURE (Status)) 777 { 778 return; 779 } 780 } 781 782 /* Dump the AddressSize array */ 783 784 for (i = 0; i < SubTable->RegisterCount; i++) 785 { 786 ArrayOffset = SubTable->AddressSizeOffset + 787 (sizeof (UINT32) * i); 788 AbsoluteOffset = Offset + ArrayOffset; 789 Array = (UINT8 *) SubTable + ArrayOffset; 790 791 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 792 SubTable->Length, AcpiDmTableInfoDbg2Size); 793 if (ACPI_FAILURE (Status)) 794 { 795 return; 796 } 797 } 798 799 /* Dump the Namestring (required) */ 800 801 AcpiOsPrintf ("\n"); 802 ArrayOffset = SubTable->NamepathOffset; 803 AbsoluteOffset = Offset + ArrayOffset; 804 Array = (UINT8 *) SubTable + ArrayOffset; 805 806 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, 807 SubTable->Length, AcpiDmTableInfoDbg2Name); 808 if (ACPI_FAILURE (Status)) 809 { 810 return; 811 } 812 813 /* Dump the OemData (optional) */ 814 815 if (SubTable->OemDataOffset) 816 { 817 AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength, 818 Offset + SubTable->OemDataOffset, "OEM Data", FALSE); 819 } 820 821 /* Point to next subtable */ 822 823 Offset += SubTable->Length; 824 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable, 825 SubTable->Length); 826 } 827 } 828 829 830 /******************************************************************************* 831 * 832 * FUNCTION: AcpiDmDumpDmar 833 * 834 * PARAMETERS: Table - A DMAR table 835 * 836 * RETURN: None 837 * 838 * DESCRIPTION: Format the contents of a DMAR. This table type consists 839 * of an open-ended number of subtables. 840 * 841 ******************************************************************************/ 842 843 844 void 845 AcpiDmDumpDmar ( 846 ACPI_TABLE_HEADER *Table) 847 { 848 ACPI_STATUS Status; 849 ACPI_DMAR_HEADER *SubTable; 850 UINT32 Length = Table->Length; 851 UINT32 Offset = sizeof (ACPI_TABLE_DMAR); 852 ACPI_DMTABLE_INFO *InfoTable; 853 ACPI_DMAR_DEVICE_SCOPE *ScopeTable; 854 UINT32 ScopeOffset; 855 UINT8 *PciPath; 856 UINT32 PathOffset; 857 858 859 /* Main table */ 860 861 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar); 862 if (ACPI_FAILURE (Status)) 863 { 864 return; 865 } 866 867 /* Subtables */ 868 869 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); 870 while (Offset < Table->Length) 871 { 872 /* Common subtable header */ 873 874 AcpiOsPrintf ("\n"); 875 Status = AcpiDmDumpTable (Length, Offset, SubTable, 876 SubTable->Length, AcpiDmTableInfoDmarHdr); 877 if (ACPI_FAILURE (Status)) 878 { 879 return; 880 } 881 AcpiOsPrintf ("\n"); 882 883 switch (SubTable->Type) 884 { 885 case ACPI_DMAR_TYPE_HARDWARE_UNIT: 886 887 InfoTable = AcpiDmTableInfoDmar0; 888 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); 889 break; 890 891 case ACPI_DMAR_TYPE_RESERVED_MEMORY: 892 893 InfoTable = AcpiDmTableInfoDmar1; 894 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); 895 break; 896 897 case ACPI_DMAR_TYPE_ROOT_ATS: 898 899 InfoTable = AcpiDmTableInfoDmar2; 900 ScopeOffset = sizeof (ACPI_DMAR_ATSR); 901 break; 902 903 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY: 904 905 InfoTable = AcpiDmTableInfoDmar3; 906 ScopeOffset = sizeof (ACPI_DMAR_RHSA); 907 break; 908 909 case ACPI_DMAR_TYPE_NAMESPACE: 910 911 InfoTable = AcpiDmTableInfoDmar4; 912 ScopeOffset = sizeof (ACPI_DMAR_ANDD); 913 break; 914 915 default: 916 917 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", SubTable->Type); 918 return; 919 } 920 921 Status = AcpiDmDumpTable (Length, Offset, SubTable, 922 SubTable->Length, InfoTable); 923 if (ACPI_FAILURE (Status)) 924 { 925 return; 926 } 927 928 /* 929 * Dump the optional device scope entries 930 */ 931 if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || 932 (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE)) 933 { 934 /* These types do not support device scopes */ 935 936 goto NextSubtable; 937 } 938 939 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); 940 while (ScopeOffset < SubTable->Length) 941 { 942 AcpiOsPrintf ("\n"); 943 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, 944 ScopeTable->Length, AcpiDmTableInfoDmarScope); 945 if (ACPI_FAILURE (Status)) 946 { 947 return; 948 } 949 AcpiOsPrintf ("\n"); 950 951 /* Dump the PCI Path entries for this device scope */ 952 953 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */ 954 955 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable, 956 sizeof (ACPI_DMAR_DEVICE_SCOPE)); 957 958 while (PathOffset < ScopeTable->Length) 959 { 960 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path"); 961 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]); 962 963 /* Point to next PCI Path entry */ 964 965 PathOffset += 2; 966 PciPath += 2; 967 AcpiOsPrintf ("\n"); 968 } 969 970 /* Point to next device scope entry */ 971 972 ScopeOffset += ScopeTable->Length; 973 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, 974 ScopeTable, ScopeTable->Length); 975 } 976 977 NextSubtable: 978 /* Point to next subtable */ 979 980 Offset += SubTable->Length; 981 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length); 982 } 983 } 984 985 986 /******************************************************************************* 987 * 988 * FUNCTION: AcpiDmDumpEinj 989 * 990 * PARAMETERS: Table - A EINJ table 991 * 992 * RETURN: None 993 * 994 * DESCRIPTION: Format the contents of a EINJ. This table type consists 995 * of an open-ended number of subtables. 996 * 997 ******************************************************************************/ 998 999 void 1000 AcpiDmDumpEinj ( 1001 ACPI_TABLE_HEADER *Table) 1002 { 1003 ACPI_STATUS Status; 1004 ACPI_WHEA_HEADER *SubTable; 1005 UINT32 Length = Table->Length; 1006 UINT32 Offset = sizeof (ACPI_TABLE_EINJ); 1007 1008 1009 /* Main table */ 1010 1011 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj); 1012 if (ACPI_FAILURE (Status)) 1013 { 1014 return; 1015 } 1016 1017 /* Subtables */ 1018 1019 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1020 while (Offset < Table->Length) 1021 { 1022 AcpiOsPrintf ("\n"); 1023 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1024 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); 1025 if (ACPI_FAILURE (Status)) 1026 { 1027 return; 1028 } 1029 1030 /* Point to next subtable (each subtable is of fixed length) */ 1031 1032 Offset += sizeof (ACPI_WHEA_HEADER); 1033 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1034 sizeof (ACPI_WHEA_HEADER)); 1035 } 1036 } 1037 1038 1039 /******************************************************************************* 1040 * 1041 * FUNCTION: AcpiDmDumpErst 1042 * 1043 * PARAMETERS: Table - A ERST table 1044 * 1045 * RETURN: None 1046 * 1047 * DESCRIPTION: Format the contents of a ERST. This table type consists 1048 * of an open-ended number of subtables. 1049 * 1050 ******************************************************************************/ 1051 1052 void 1053 AcpiDmDumpErst ( 1054 ACPI_TABLE_HEADER *Table) 1055 { 1056 ACPI_STATUS Status; 1057 ACPI_WHEA_HEADER *SubTable; 1058 UINT32 Length = Table->Length; 1059 UINT32 Offset = sizeof (ACPI_TABLE_ERST); 1060 1061 1062 /* Main table */ 1063 1064 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst); 1065 if (ACPI_FAILURE (Status)) 1066 { 1067 return; 1068 } 1069 1070 /* Subtables */ 1071 1072 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); 1073 while (Offset < Table->Length) 1074 { 1075 AcpiOsPrintf ("\n"); 1076 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1077 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); 1078 if (ACPI_FAILURE (Status)) 1079 { 1080 return; 1081 } 1082 1083 /* Point to next subtable (each subtable is of fixed length) */ 1084 1085 Offset += sizeof (ACPI_WHEA_HEADER); 1086 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, 1087 sizeof (ACPI_WHEA_HEADER)); 1088 } 1089 } 1090 1091 1092 /******************************************************************************* 1093 * 1094 * FUNCTION: AcpiDmDumpFpdt 1095 * 1096 * PARAMETERS: Table - A FPDT table 1097 * 1098 * RETURN: None 1099 * 1100 * DESCRIPTION: Format the contents of a FPDT. This table type consists 1101 * of an open-ended number of subtables. 1102 * 1103 ******************************************************************************/ 1104 1105 void 1106 AcpiDmDumpFpdt ( 1107 ACPI_TABLE_HEADER *Table) 1108 { 1109 ACPI_STATUS Status; 1110 ACPI_FPDT_HEADER *SubTable; 1111 UINT32 Length = Table->Length; 1112 UINT32 Offset = sizeof (ACPI_TABLE_FPDT); 1113 ACPI_DMTABLE_INFO *InfoTable; 1114 1115 1116 /* There is no main table (other than the standard ACPI header) */ 1117 1118 /* Subtables */ 1119 1120 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); 1121 while (Offset < Table->Length) 1122 { 1123 /* Common subtable header */ 1124 1125 AcpiOsPrintf ("\n"); 1126 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1127 SubTable->Length, AcpiDmTableInfoFpdtHdr); 1128 if (ACPI_FAILURE (Status)) 1129 { 1130 return; 1131 } 1132 1133 switch (SubTable->Type) 1134 { 1135 case ACPI_FPDT_TYPE_BOOT: 1136 1137 InfoTable = AcpiDmTableInfoFpdt0; 1138 break; 1139 1140 case ACPI_FPDT_TYPE_S3PERF: 1141 1142 InfoTable = AcpiDmTableInfoFpdt1; 1143 break; 1144 1145 default: 1146 1147 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", SubTable->Type); 1148 1149 /* Attempt to continue */ 1150 1151 if (!SubTable->Length) 1152 { 1153 AcpiOsPrintf ("Invalid zero length subtable\n"); 1154 return; 1155 } 1156 goto NextSubTable; 1157 } 1158 1159 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1160 SubTable->Length, InfoTable); 1161 if (ACPI_FAILURE (Status)) 1162 { 1163 return; 1164 } 1165 1166 NextSubTable: 1167 /* Point to next subtable */ 1168 1169 Offset += SubTable->Length; 1170 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length); 1171 } 1172 } 1173 1174 1175 /******************************************************************************* 1176 * 1177 * FUNCTION: AcpiDmDumpGtdt 1178 * 1179 * PARAMETERS: Table - A GTDT table 1180 * 1181 * RETURN: None 1182 * 1183 * DESCRIPTION: Format the contents of a GTDT. This table type consists 1184 * of an open-ended number of subtables. 1185 * 1186 ******************************************************************************/ 1187 1188 void 1189 AcpiDmDumpGtdt ( 1190 ACPI_TABLE_HEADER *Table) 1191 { 1192 ACPI_STATUS Status; 1193 ACPI_GTDT_HEADER *SubTable; 1194 UINT32 Length = Table->Length; 1195 UINT32 Offset = sizeof (ACPI_TABLE_GTDT); 1196 ACPI_DMTABLE_INFO *InfoTable; 1197 UINT32 SubTableLength; 1198 UINT32 GtCount; 1199 ACPI_GTDT_TIMER_ENTRY *GtxTable; 1200 1201 1202 /* Main table */ 1203 1204 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt); 1205 if (ACPI_FAILURE (Status)) 1206 { 1207 return; 1208 } 1209 1210 /* Subtables */ 1211 1212 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); 1213 while (Offset < Table->Length) 1214 { 1215 /* Common subtable header */ 1216 1217 AcpiOsPrintf ("\n"); 1218 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1219 SubTable->Length, AcpiDmTableInfoGtdtHdr); 1220 if (ACPI_FAILURE (Status)) 1221 { 1222 return; 1223 } 1224 1225 GtCount = 0; 1226 switch (SubTable->Type) 1227 { 1228 case ACPI_GTDT_TYPE_TIMER_BLOCK: 1229 1230 SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); 1231 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, 1232 SubTable))->TimerCount; 1233 1234 InfoTable = AcpiDmTableInfoGtdt0; 1235 break; 1236 1237 case ACPI_GTDT_TYPE_WATCHDOG: 1238 1239 SubTableLength = sizeof (ACPI_GTDT_WATCHDOG); 1240 1241 InfoTable = AcpiDmTableInfoGtdt1; 1242 break; 1243 1244 default: 1245 1246 /* Cannot continue on unknown type - no length */ 1247 1248 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", SubTable->Type); 1249 return; 1250 } 1251 1252 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1253 SubTable->Length, InfoTable); 1254 if (ACPI_FAILURE (Status)) 1255 { 1256 return; 1257 } 1258 1259 /* Point to end of current subtable (each subtable above is of fixed length) */ 1260 1261 Offset += SubTableLength; 1262 1263 /* If there are any Gt Timer Blocks from above, dump them now */ 1264 1265 if (GtCount) 1266 { 1267 GtxTable = ACPI_ADD_PTR (ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength); 1268 SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); 1269 1270 while (GtCount) 1271 { 1272 AcpiOsPrintf ("\n"); 1273 Status = AcpiDmDumpTable (Length, Offset, GtxTable, 1274 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a); 1275 if (ACPI_FAILURE (Status)) 1276 { 1277 return; 1278 } 1279 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY); 1280 GtxTable++; 1281 GtCount--; 1282 } 1283 } 1284 1285 /* Point to next subtable */ 1286 1287 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength); 1288 } 1289 } 1290 1291 1292 /******************************************************************************* 1293 * 1294 * FUNCTION: AcpiDmDumpHest 1295 * 1296 * PARAMETERS: Table - A HEST table 1297 * 1298 * RETURN: None 1299 * 1300 * DESCRIPTION: Format the contents of a HEST. This table type consists 1301 * of an open-ended number of subtables. 1302 * 1303 ******************************************************************************/ 1304 1305 void 1306 AcpiDmDumpHest ( 1307 ACPI_TABLE_HEADER *Table) 1308 { 1309 ACPI_STATUS Status; 1310 ACPI_HEST_HEADER *SubTable; 1311 UINT32 Length = Table->Length; 1312 UINT32 Offset = sizeof (ACPI_TABLE_HEST); 1313 ACPI_DMTABLE_INFO *InfoTable; 1314 UINT32 SubTableLength; 1315 UINT32 BankCount; 1316 ACPI_HEST_IA_ERROR_BANK *BankTable; 1317 1318 1319 /* Main table */ 1320 1321 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest); 1322 if (ACPI_FAILURE (Status)) 1323 { 1324 return; 1325 } 1326 1327 /* Subtables */ 1328 1329 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); 1330 while (Offset < Table->Length) 1331 { 1332 BankCount = 0; 1333 switch (SubTable->Type) 1334 { 1335 case ACPI_HEST_TYPE_IA32_CHECK: 1336 1337 InfoTable = AcpiDmTableInfoHest0; 1338 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); 1339 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, 1340 SubTable))->NumHardwareBanks; 1341 break; 1342 1343 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: 1344 1345 InfoTable = AcpiDmTableInfoHest1; 1346 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); 1347 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, 1348 SubTable))->NumHardwareBanks; 1349 break; 1350 1351 case ACPI_HEST_TYPE_IA32_NMI: 1352 1353 InfoTable = AcpiDmTableInfoHest2; 1354 SubTableLength = sizeof (ACPI_HEST_IA_NMI); 1355 break; 1356 1357 case ACPI_HEST_TYPE_AER_ROOT_PORT: 1358 1359 InfoTable = AcpiDmTableInfoHest6; 1360 SubTableLength = sizeof (ACPI_HEST_AER_ROOT); 1361 break; 1362 1363 case ACPI_HEST_TYPE_AER_ENDPOINT: 1364 1365 InfoTable = AcpiDmTableInfoHest7; 1366 SubTableLength = sizeof (ACPI_HEST_AER); 1367 break; 1368 1369 case ACPI_HEST_TYPE_AER_BRIDGE: 1370 1371 InfoTable = AcpiDmTableInfoHest8; 1372 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); 1373 break; 1374 1375 case ACPI_HEST_TYPE_GENERIC_ERROR: 1376 1377 InfoTable = AcpiDmTableInfoHest9; 1378 SubTableLength = sizeof (ACPI_HEST_GENERIC); 1379 break; 1380 1381 default: 1382 1383 /* Cannot continue on unknown type - no length */ 1384 1385 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", SubTable->Type); 1386 return; 1387 } 1388 1389 AcpiOsPrintf ("\n"); 1390 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1391 SubTableLength, InfoTable); 1392 if (ACPI_FAILURE (Status)) 1393 { 1394 return; 1395 } 1396 1397 /* Point to end of current subtable (each subtable above is of fixed length) */ 1398 1399 Offset += SubTableLength; 1400 1401 /* If there are any (fixed-length) Error Banks from above, dump them now */ 1402 1403 if (BankCount) 1404 { 1405 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength); 1406 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); 1407 1408 while (BankCount) 1409 { 1410 AcpiOsPrintf ("\n"); 1411 Status = AcpiDmDumpTable (Length, Offset, BankTable, 1412 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank); 1413 if (ACPI_FAILURE (Status)) 1414 { 1415 return; 1416 } 1417 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK); 1418 BankTable++; 1419 BankCount--; 1420 } 1421 } 1422 1423 /* Point to next subtable */ 1424 1425 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); 1426 } 1427 } 1428 1429 1430 /******************************************************************************* 1431 * 1432 * FUNCTION: AcpiDmDumpIvrs 1433 * 1434 * PARAMETERS: Table - A IVRS table 1435 * 1436 * RETURN: None 1437 * 1438 * DESCRIPTION: Format the contents of a IVRS 1439 * 1440 ******************************************************************************/ 1441 1442 static UINT8 EntrySizes[] = {4,8,16,32}; 1443 1444 void 1445 AcpiDmDumpIvrs ( 1446 ACPI_TABLE_HEADER *Table) 1447 { 1448 ACPI_STATUS Status; 1449 UINT32 Offset = sizeof (ACPI_TABLE_IVRS); 1450 UINT32 EntryOffset; 1451 UINT32 EntryLength; 1452 UINT32 EntryType; 1453 ACPI_IVRS_DE_HEADER *DeviceEntry; 1454 ACPI_IVRS_HEADER *SubTable; 1455 ACPI_DMTABLE_INFO *InfoTable; 1456 1457 1458 /* Main table */ 1459 1460 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs); 1461 if (ACPI_FAILURE (Status)) 1462 { 1463 return; 1464 } 1465 1466 /* Subtables */ 1467 1468 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); 1469 while (Offset < Table->Length) 1470 { 1471 /* Common subtable header */ 1472 1473 AcpiOsPrintf ("\n"); 1474 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1475 SubTable->Length, AcpiDmTableInfoIvrsHdr); 1476 if (ACPI_FAILURE (Status)) 1477 { 1478 return; 1479 } 1480 1481 switch (SubTable->Type) 1482 { 1483 case ACPI_IVRS_TYPE_HARDWARE: 1484 1485 InfoTable = AcpiDmTableInfoIvrs0; 1486 break; 1487 1488 case ACPI_IVRS_TYPE_MEMORY1: 1489 case ACPI_IVRS_TYPE_MEMORY2: 1490 case ACPI_IVRS_TYPE_MEMORY3: 1491 1492 InfoTable = AcpiDmTableInfoIvrs1; 1493 break; 1494 1495 default: 1496 1497 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", 1498 SubTable->Type); 1499 1500 /* Attempt to continue */ 1501 1502 if (!SubTable->Length) 1503 { 1504 AcpiOsPrintf ("Invalid zero length subtable\n"); 1505 return; 1506 } 1507 goto NextSubTable; 1508 } 1509 1510 /* Dump the subtable */ 1511 1512 AcpiOsPrintf ("\n"); 1513 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1514 SubTable->Length, InfoTable); 1515 if (ACPI_FAILURE (Status)) 1516 { 1517 return; 1518 } 1519 1520 /* The hardware subtable can contain multiple device entries */ 1521 1522 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) 1523 { 1524 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); 1525 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, 1526 sizeof (ACPI_IVRS_HARDWARE)); 1527 1528 while (EntryOffset < (Offset + SubTable->Length)) 1529 { 1530 AcpiOsPrintf ("\n"); 1531 /* 1532 * Upper 2 bits of Type encode the length of the device entry 1533 * 1534 * 00 = 4 byte 1535 * 01 = 8 byte 1536 * 10 = 16 byte - currently no entries defined 1537 * 11 = 32 byte - currently no entries defined 1538 */ 1539 EntryType = DeviceEntry->Type; 1540 EntryLength = EntrySizes [EntryType >> 6]; 1541 1542 switch (EntryType) 1543 { 1544 /* 4-byte device entries */ 1545 1546 case ACPI_IVRS_TYPE_PAD4: 1547 case ACPI_IVRS_TYPE_ALL: 1548 case ACPI_IVRS_TYPE_SELECT: 1549 case ACPI_IVRS_TYPE_START: 1550 case ACPI_IVRS_TYPE_END: 1551 1552 InfoTable = AcpiDmTableInfoIvrs4; 1553 break; 1554 1555 /* 8-byte entries, type A */ 1556 1557 case ACPI_IVRS_TYPE_ALIAS_SELECT: 1558 case ACPI_IVRS_TYPE_ALIAS_START: 1559 1560 InfoTable = AcpiDmTableInfoIvrs8a; 1561 break; 1562 1563 /* 8-byte entries, type B */ 1564 1565 case ACPI_IVRS_TYPE_PAD8: 1566 case ACPI_IVRS_TYPE_EXT_SELECT: 1567 case ACPI_IVRS_TYPE_EXT_START: 1568 1569 InfoTable = AcpiDmTableInfoIvrs8b; 1570 break; 1571 1572 /* 8-byte entries, type C */ 1573 1574 case ACPI_IVRS_TYPE_SPECIAL: 1575 1576 InfoTable = AcpiDmTableInfoIvrs8c; 1577 break; 1578 1579 default: 1580 InfoTable = AcpiDmTableInfoIvrs4; 1581 AcpiOsPrintf ( 1582 "\n**** Unknown IVRS device entry type/length: " 1583 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n", 1584 EntryType, EntryLength, EntryOffset); 1585 break; 1586 } 1587 1588 /* Dump the Device Entry */ 1589 1590 Status = AcpiDmDumpTable (Table->Length, EntryOffset, 1591 DeviceEntry, EntryLength, InfoTable); 1592 1593 EntryOffset += EntryLength; 1594 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry, 1595 EntryLength); 1596 } 1597 } 1598 1599 NextSubTable: 1600 /* Point to next subtable */ 1601 1602 Offset += SubTable->Length; 1603 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); 1604 } 1605 } 1606 1607 1608 /******************************************************************************* 1609 * 1610 * FUNCTION: AcpiDmDumpLpit 1611 * 1612 * PARAMETERS: Table - A LPIT table 1613 * 1614 * RETURN: None 1615 * 1616 * DESCRIPTION: Format the contents of a LPIT. This table type consists 1617 * of an open-ended number of subtables. Note: There are no 1618 * entries in the main table. An LPIT consists of the table 1619 * header and then subtables only. 1620 * 1621 ******************************************************************************/ 1622 1623 void 1624 AcpiDmDumpLpit ( 1625 ACPI_TABLE_HEADER *Table) 1626 { 1627 ACPI_STATUS Status; 1628 ACPI_LPIT_HEADER *SubTable; 1629 UINT32 Length = Table->Length; 1630 UINT32 Offset = sizeof (ACPI_TABLE_LPIT); 1631 ACPI_DMTABLE_INFO *InfoTable; 1632 UINT32 SubTableLength; 1633 1634 1635 /* Subtables */ 1636 1637 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); 1638 while (Offset < Table->Length) 1639 { 1640 /* Common subtable header */ 1641 1642 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1643 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); 1644 if (ACPI_FAILURE (Status)) 1645 { 1646 return; 1647 } 1648 1649 switch (SubTable->Type) 1650 { 1651 case ACPI_LPIT_TYPE_NATIVE_CSTATE: 1652 1653 InfoTable = AcpiDmTableInfoLpit0; 1654 SubTableLength = sizeof (ACPI_LPIT_NATIVE); 1655 break; 1656 1657 case ACPI_LPIT_TYPE_SIMPLE_IO: 1658 1659 InfoTable = AcpiDmTableInfoLpit1; 1660 SubTableLength = sizeof (ACPI_LPIT_IO); 1661 break; 1662 1663 default: 1664 1665 /* Cannot continue on unknown type - no length */ 1666 1667 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", SubTable->Type); 1668 return; 1669 } 1670 1671 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1672 SubTableLength, InfoTable); 1673 if (ACPI_FAILURE (Status)) 1674 { 1675 return; 1676 } 1677 AcpiOsPrintf ("\n"); 1678 1679 /* Point to next subtable */ 1680 1681 Offset += SubTableLength; 1682 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength); 1683 } 1684 } 1685 1686 1687 /******************************************************************************* 1688 * 1689 * FUNCTION: AcpiDmDumpMadt 1690 * 1691 * PARAMETERS: Table - A MADT table 1692 * 1693 * RETURN: None 1694 * 1695 * DESCRIPTION: Format the contents of a MADT. This table type consists 1696 * of an open-ended number of subtables. 1697 * 1698 ******************************************************************************/ 1699 1700 void 1701 AcpiDmDumpMadt ( 1702 ACPI_TABLE_HEADER *Table) 1703 { 1704 ACPI_STATUS Status; 1705 ACPI_SUBTABLE_HEADER *SubTable; 1706 UINT32 Length = Table->Length; 1707 UINT32 Offset = sizeof (ACPI_TABLE_MADT); 1708 ACPI_DMTABLE_INFO *InfoTable; 1709 1710 1711 /* Main table */ 1712 1713 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt); 1714 if (ACPI_FAILURE (Status)) 1715 { 1716 return; 1717 } 1718 1719 /* Subtables */ 1720 1721 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 1722 while (Offset < Table->Length) 1723 { 1724 /* Common subtable header */ 1725 1726 AcpiOsPrintf ("\n"); 1727 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1728 SubTable->Length, AcpiDmTableInfoMadtHdr); 1729 if (ACPI_FAILURE (Status)) 1730 { 1731 return; 1732 } 1733 1734 switch (SubTable->Type) 1735 { 1736 case ACPI_MADT_TYPE_LOCAL_APIC: 1737 1738 InfoTable = AcpiDmTableInfoMadt0; 1739 break; 1740 1741 case ACPI_MADT_TYPE_IO_APIC: 1742 1743 InfoTable = AcpiDmTableInfoMadt1; 1744 break; 1745 1746 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 1747 1748 InfoTable = AcpiDmTableInfoMadt2; 1749 break; 1750 1751 case ACPI_MADT_TYPE_NMI_SOURCE: 1752 1753 InfoTable = AcpiDmTableInfoMadt3; 1754 break; 1755 1756 case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 1757 1758 InfoTable = AcpiDmTableInfoMadt4; 1759 break; 1760 1761 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 1762 1763 InfoTable = AcpiDmTableInfoMadt5; 1764 break; 1765 1766 case ACPI_MADT_TYPE_IO_SAPIC: 1767 1768 InfoTable = AcpiDmTableInfoMadt6; 1769 break; 1770 1771 case ACPI_MADT_TYPE_LOCAL_SAPIC: 1772 1773 InfoTable = AcpiDmTableInfoMadt7; 1774 break; 1775 1776 case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 1777 1778 InfoTable = AcpiDmTableInfoMadt8; 1779 break; 1780 1781 case ACPI_MADT_TYPE_LOCAL_X2APIC: 1782 1783 InfoTable = AcpiDmTableInfoMadt9; 1784 break; 1785 1786 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 1787 1788 InfoTable = AcpiDmTableInfoMadt10; 1789 break; 1790 1791 case ACPI_MADT_TYPE_GENERIC_INTERRUPT: 1792 1793 InfoTable = AcpiDmTableInfoMadt11; 1794 break; 1795 1796 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: 1797 1798 InfoTable = AcpiDmTableInfoMadt12; 1799 break; 1800 1801 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME: 1802 1803 InfoTable = AcpiDmTableInfoMadt13; 1804 break; 1805 1806 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR: 1807 1808 InfoTable = AcpiDmTableInfoMadt14; 1809 break; 1810 1811 default: 1812 1813 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", SubTable->Type); 1814 1815 /* Attempt to continue */ 1816 1817 if (!SubTable->Length) 1818 { 1819 AcpiOsPrintf ("Invalid zero length subtable\n"); 1820 return; 1821 } 1822 goto NextSubTable; 1823 } 1824 1825 Status = AcpiDmDumpTable (Length, Offset, SubTable, 1826 SubTable->Length, InfoTable); 1827 if (ACPI_FAILURE (Status)) 1828 { 1829 return; 1830 } 1831 1832 NextSubTable: 1833 /* Point to next subtable */ 1834 1835 Offset += SubTable->Length; 1836 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 1837 } 1838 } 1839 1840 1841 /******************************************************************************* 1842 * 1843 * FUNCTION: AcpiDmDumpMcfg 1844 * 1845 * PARAMETERS: Table - A MCFG Table 1846 * 1847 * RETURN: None 1848 * 1849 * DESCRIPTION: Format the contents of a MCFG table 1850 * 1851 ******************************************************************************/ 1852 1853 void 1854 AcpiDmDumpMcfg ( 1855 ACPI_TABLE_HEADER *Table) 1856 { 1857 ACPI_STATUS Status; 1858 UINT32 Offset = sizeof (ACPI_TABLE_MCFG); 1859 ACPI_MCFG_ALLOCATION *SubTable; 1860 1861 1862 /* Main table */ 1863 1864 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg); 1865 if (ACPI_FAILURE (Status)) 1866 { 1867 return; 1868 } 1869 1870 /* Subtables */ 1871 1872 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); 1873 while (Offset < Table->Length) 1874 { 1875 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) 1876 { 1877 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n", 1878 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length)); 1879 return; 1880 } 1881 1882 AcpiOsPrintf ("\n"); 1883 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 1884 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); 1885 if (ACPI_FAILURE (Status)) 1886 { 1887 return; 1888 } 1889 1890 /* Point to next subtable (each subtable is of fixed length) */ 1891 1892 Offset += sizeof (ACPI_MCFG_ALLOCATION); 1893 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, 1894 sizeof (ACPI_MCFG_ALLOCATION)); 1895 } 1896 } 1897 1898 1899 /******************************************************************************* 1900 * 1901 * FUNCTION: AcpiDmDumpMpst 1902 * 1903 * PARAMETERS: Table - A MPST Table 1904 * 1905 * RETURN: None 1906 * 1907 * DESCRIPTION: Format the contents of a MPST table 1908 * 1909 ******************************************************************************/ 1910 1911 void 1912 AcpiDmDumpMpst ( 1913 ACPI_TABLE_HEADER *Table) 1914 { 1915 ACPI_STATUS Status; 1916 UINT32 Offset = sizeof (ACPI_TABLE_MPST); 1917 ACPI_MPST_POWER_NODE *SubTable0; 1918 ACPI_MPST_POWER_STATE *SubTable0A; 1919 ACPI_MPST_COMPONENT *SubTable0B; 1920 ACPI_MPST_DATA_HDR *SubTable1; 1921 ACPI_MPST_POWER_DATA *SubTable2; 1922 UINT16 SubtableCount; 1923 UINT32 PowerStateCount; 1924 UINT32 ComponentCount; 1925 1926 1927 /* Main table */ 1928 1929 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst); 1930 if (ACPI_FAILURE (Status)) 1931 { 1932 return; 1933 } 1934 1935 /* Subtable: Memory Power Node(s) */ 1936 1937 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; 1938 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); 1939 1940 while ((Offset < Table->Length) && SubtableCount) 1941 { 1942 AcpiOsPrintf ("\n"); 1943 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, 1944 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); 1945 if (ACPI_FAILURE (Status)) 1946 { 1947 return; 1948 } 1949 1950 /* Extract the sub-subtable counts */ 1951 1952 PowerStateCount = SubTable0->NumPowerStates; 1953 ComponentCount = SubTable0->NumPhysicalComponents; 1954 Offset += sizeof (ACPI_MPST_POWER_NODE); 1955 1956 /* Sub-subtables - Memory Power State Structure(s) */ 1957 1958 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, 1959 sizeof (ACPI_MPST_POWER_NODE)); 1960 1961 while (PowerStateCount) 1962 { 1963 AcpiOsPrintf ("\n"); 1964 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, 1965 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); 1966 if (ACPI_FAILURE (Status)) 1967 { 1968 return; 1969 } 1970 1971 SubTable0A++; 1972 PowerStateCount--; 1973 Offset += sizeof (ACPI_MPST_POWER_STATE); 1974 } 1975 1976 /* Sub-subtables - Physical Component ID Structure(s) */ 1977 1978 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); 1979 1980 if (ComponentCount) 1981 { 1982 AcpiOsPrintf ("\n"); 1983 } 1984 1985 while (ComponentCount) 1986 { 1987 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, 1988 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); 1989 if (ACPI_FAILURE (Status)) 1990 { 1991 return; 1992 } 1993 1994 SubTable0B++; 1995 ComponentCount--; 1996 Offset += sizeof (ACPI_MPST_COMPONENT); 1997 } 1998 1999 /* Point to next Memory Power Node subtable */ 2000 2001 SubtableCount--; 2002 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, 2003 sizeof (ACPI_MPST_POWER_NODE) + 2004 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) + 2005 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents)); 2006 } 2007 2008 /* Subtable: Count of Memory Power State Characteristic structures */ 2009 2010 AcpiOsPrintf ("\n"); 2011 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0); 2012 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1, 2013 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); 2014 if (ACPI_FAILURE (Status)) 2015 { 2016 return; 2017 } 2018 2019 SubtableCount = SubTable1->CharacteristicsCount; 2020 Offset += sizeof (ACPI_MPST_DATA_HDR); 2021 2022 /* Subtable: Memory Power State Characteristics structure(s) */ 2023 2024 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR)); 2025 2026 while ((Offset < Table->Length) && SubtableCount) 2027 { 2028 AcpiOsPrintf ("\n"); 2029 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, 2030 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); 2031 if (ACPI_FAILURE (Status)) 2032 { 2033 return; 2034 } 2035 2036 SubTable2++; 2037 SubtableCount--; 2038 Offset += sizeof (ACPI_MPST_POWER_DATA); 2039 } 2040 } 2041 2042 2043 /******************************************************************************* 2044 * 2045 * FUNCTION: AcpiDmDumpMsct 2046 * 2047 * PARAMETERS: Table - A MSCT table 2048 * 2049 * RETURN: None 2050 * 2051 * DESCRIPTION: Format the contents of a MSCT 2052 * 2053 ******************************************************************************/ 2054 2055 void 2056 AcpiDmDumpMsct ( 2057 ACPI_TABLE_HEADER *Table) 2058 { 2059 ACPI_STATUS Status; 2060 UINT32 Offset = sizeof (ACPI_TABLE_MSCT); 2061 ACPI_MSCT_PROXIMITY *SubTable; 2062 2063 2064 /* Main table */ 2065 2066 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct); 2067 if (ACPI_FAILURE (Status)) 2068 { 2069 return; 2070 } 2071 2072 /* Subtables */ 2073 2074 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); 2075 while (Offset < Table->Length) 2076 { 2077 /* Common subtable header */ 2078 2079 AcpiOsPrintf ("\n"); 2080 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2081 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); 2082 if (ACPI_FAILURE (Status)) 2083 { 2084 return; 2085 } 2086 2087 /* Point to next subtable */ 2088 2089 Offset += sizeof (ACPI_MSCT_PROXIMITY); 2090 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY)); 2091 } 2092 } 2093 2094 2095 /******************************************************************************* 2096 * 2097 * FUNCTION: AcpiDmDumpMtmr 2098 * 2099 * PARAMETERS: Table - A MTMR table 2100 * 2101 * RETURN: None 2102 * 2103 * DESCRIPTION: Format the contents of a MTMR 2104 * 2105 ******************************************************************************/ 2106 2107 void 2108 AcpiDmDumpMtmr ( 2109 ACPI_TABLE_HEADER *Table) 2110 { 2111 ACPI_STATUS Status; 2112 UINT32 Offset = sizeof (ACPI_TABLE_MTMR); 2113 ACPI_MTMR_ENTRY *SubTable; 2114 2115 2116 /* Main table */ 2117 2118 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr); 2119 if (ACPI_FAILURE (Status)) 2120 { 2121 return; 2122 } 2123 2124 /* Subtables */ 2125 2126 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); 2127 while (Offset < Table->Length) 2128 { 2129 /* Common subtable header */ 2130 2131 AcpiOsPrintf ("\n"); 2132 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2133 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0); 2134 if (ACPI_FAILURE (Status)) 2135 { 2136 return; 2137 } 2138 2139 /* Point to next subtable */ 2140 2141 Offset += sizeof (ACPI_MTMR_ENTRY); 2142 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY)); 2143 } 2144 } 2145 2146 2147 /******************************************************************************* 2148 * 2149 * FUNCTION: AcpiDmDumpPcct 2150 * 2151 * PARAMETERS: Table - A PCCT table 2152 * 2153 * RETURN: None 2154 * 2155 * DESCRIPTION: Format the contents of a PCCT. This table type consists 2156 * of an open-ended number of subtables. 2157 * 2158 ******************************************************************************/ 2159 2160 void 2161 AcpiDmDumpPcct ( 2162 ACPI_TABLE_HEADER *Table) 2163 { 2164 ACPI_STATUS Status; 2165 ACPI_PCCT_SUBSPACE *SubTable; 2166 ACPI_DMTABLE_INFO *InfoTable; 2167 UINT32 Length = Table->Length; 2168 UINT32 Offset = sizeof (ACPI_TABLE_PCCT); 2169 2170 2171 /* Main table */ 2172 2173 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct); 2174 if (ACPI_FAILURE (Status)) 2175 { 2176 return; 2177 } 2178 2179 /* Subtables */ 2180 2181 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); 2182 while (Offset < Table->Length) 2183 { 2184 /* Common subtable header */ 2185 2186 AcpiOsPrintf ("\n"); 2187 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2188 SubTable->Header.Length, AcpiDmTableInfoPcctHdr); 2189 if (ACPI_FAILURE (Status)) 2190 { 2191 return; 2192 } 2193 2194 switch (SubTable->Header.Type) 2195 { 2196 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: 2197 2198 InfoTable = AcpiDmTableInfoPcct0; 2199 break; 2200 2201 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE: 2202 2203 InfoTable = AcpiDmTableInfoPcct1; 2204 break; 2205 2206 default: 2207 2208 AcpiOsPrintf ( 2209 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", 2210 SubTable->Header.Type); 2211 return; 2212 } 2213 2214 AcpiOsPrintf ("\n"); 2215 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2216 SubTable->Header.Length, InfoTable); 2217 if (ACPI_FAILURE (Status)) 2218 { 2219 return; 2220 } 2221 2222 /* Point to next subtable */ 2223 2224 Offset += SubTable->Header.Length; 2225 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, 2226 SubTable->Header.Length); 2227 } 2228 } 2229 2230 2231 /******************************************************************************* 2232 * 2233 * FUNCTION: AcpiDmDumpPmtt 2234 * 2235 * PARAMETERS: Table - A PMTT table 2236 * 2237 * RETURN: None 2238 * 2239 * DESCRIPTION: Format the contents of a PMTT. This table type consists 2240 * of an open-ended number of subtables. 2241 * 2242 ******************************************************************************/ 2243 2244 void 2245 AcpiDmDumpPmtt ( 2246 ACPI_TABLE_HEADER *Table) 2247 { 2248 ACPI_STATUS Status; 2249 ACPI_PMTT_HEADER *SubTable; 2250 ACPI_PMTT_HEADER *MemSubTable; 2251 ACPI_PMTT_HEADER *DimmSubTable; 2252 ACPI_PMTT_DOMAIN *DomainArray; 2253 UINT32 Length = Table->Length; 2254 UINT32 Offset = sizeof (ACPI_TABLE_PMTT); 2255 UINT32 MemOffset; 2256 UINT32 DimmOffset; 2257 UINT32 DomainOffset; 2258 UINT32 DomainCount; 2259 2260 2261 /* Main table */ 2262 2263 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt); 2264 if (ACPI_FAILURE (Status)) 2265 { 2266 return; 2267 } 2268 2269 /* Subtables */ 2270 2271 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); 2272 while (Offset < Table->Length) 2273 { 2274 /* Common subtable header */ 2275 2276 AcpiOsPrintf ("\n"); 2277 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2278 SubTable->Length, AcpiDmTableInfoPmttHdr); 2279 if (ACPI_FAILURE (Status)) 2280 { 2281 return; 2282 } 2283 2284 /* Only Socket subtables are expected at this level */ 2285 2286 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) 2287 { 2288 AcpiOsPrintf ( 2289 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2290 SubTable->Type); 2291 return; 2292 } 2293 2294 /* Dump the fixed-length portion of the subtable */ 2295 2296 Status = AcpiDmDumpTable (Length, Offset, SubTable, 2297 SubTable->Length, AcpiDmTableInfoPmtt0); 2298 if (ACPI_FAILURE (Status)) 2299 { 2300 return; 2301 } 2302 2303 /* Walk the memory controller subtables */ 2304 2305 MemOffset = sizeof (ACPI_PMTT_SOCKET); 2306 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, 2307 sizeof (ACPI_PMTT_SOCKET)); 2308 2309 while (((Offset + MemOffset) < Table->Length) && 2310 (MemOffset < SubTable->Length)) 2311 { 2312 /* Common subtable header */ 2313 2314 AcpiOsPrintf ("\n"); 2315 Status = AcpiDmDumpTable (Length, 2316 Offset + MemOffset, MemSubTable, 2317 MemSubTable->Length, AcpiDmTableInfoPmttHdr); 2318 if (ACPI_FAILURE (Status)) 2319 { 2320 return; 2321 } 2322 2323 /* Only memory controller subtables are expected at this level */ 2324 2325 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) 2326 { 2327 AcpiOsPrintf ( 2328 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2329 MemSubTable->Type); 2330 return; 2331 } 2332 2333 /* Dump the fixed-length portion of the controller subtable */ 2334 2335 Status = AcpiDmDumpTable (Length, 2336 Offset + MemOffset, MemSubTable, 2337 MemSubTable->Length, AcpiDmTableInfoPmtt1); 2338 if (ACPI_FAILURE (Status)) 2339 { 2340 return; 2341 } 2342 2343 /* Walk the variable count of proximity domains */ 2344 2345 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; 2346 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); 2347 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, 2348 sizeof (ACPI_PMTT_CONTROLLER)); 2349 2350 while (((Offset + MemOffset + DomainOffset) < Table->Length) && 2351 ((MemOffset + DomainOffset) < SubTable->Length) && 2352 DomainCount) 2353 { 2354 Status = AcpiDmDumpTable (Length, 2355 Offset + MemOffset + DomainOffset, DomainArray, 2356 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a); 2357 if (ACPI_FAILURE (Status)) 2358 { 2359 return; 2360 } 2361 2362 DomainOffset += sizeof (ACPI_PMTT_DOMAIN); 2363 DomainArray++; 2364 DomainCount--; 2365 } 2366 2367 if (DomainCount) 2368 { 2369 AcpiOsPrintf ( 2370 "\n**** DomainCount exceeds subtable length\n\n"); 2371 } 2372 2373 /* Walk the physical component (DIMM) subtables */ 2374 2375 DimmOffset = DomainOffset; 2376 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, 2377 DomainOffset); 2378 2379 while (((Offset + MemOffset + DimmOffset) < Table->Length) && 2380 (DimmOffset < MemSubTable->Length)) 2381 { 2382 /* Common subtable header */ 2383 2384 AcpiOsPrintf ("\n"); 2385 Status = AcpiDmDumpTable (Length, 2386 Offset + MemOffset + DimmOffset, DimmSubTable, 2387 DimmSubTable->Length, AcpiDmTableInfoPmttHdr); 2388 if (ACPI_FAILURE (Status)) 2389 { 2390 return; 2391 } 2392 2393 /* Only DIMM subtables are expected at this level */ 2394 2395 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) 2396 { 2397 AcpiOsPrintf ( 2398 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", 2399 DimmSubTable->Type); 2400 return; 2401 } 2402 2403 /* Dump the fixed-length DIMM subtable */ 2404 2405 Status = AcpiDmDumpTable (Length, 2406 Offset + MemOffset + DimmOffset, DimmSubTable, 2407 DimmSubTable->Length, AcpiDmTableInfoPmtt2); 2408 if (ACPI_FAILURE (Status)) 2409 { 2410 return; 2411 } 2412 2413 /* Point to next DIMM subtable */ 2414 2415 DimmOffset += DimmSubTable->Length; 2416 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2417 DimmSubTable, DimmSubTable->Length); 2418 } 2419 2420 /* Point to next Controller subtable */ 2421 2422 MemOffset += MemSubTable->Length; 2423 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2424 MemSubTable, MemSubTable->Length); 2425 } 2426 2427 /* Point to next Socket subtable */ 2428 2429 Offset += SubTable->Length; 2430 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, 2431 SubTable, SubTable->Length); 2432 } 2433 } 2434 2435 2436 /******************************************************************************* 2437 * 2438 * FUNCTION: AcpiDmDumpS3pt 2439 * 2440 * PARAMETERS: Table - A S3PT table 2441 * 2442 * RETURN: Length of the table 2443 * 2444 * DESCRIPTION: Format the contents of a S3PT 2445 * 2446 ******************************************************************************/ 2447 2448 UINT32 2449 AcpiDmDumpS3pt ( 2450 ACPI_TABLE_HEADER *Tables) 2451 { 2452 ACPI_STATUS Status; 2453 UINT32 Offset = sizeof (ACPI_TABLE_S3PT); 2454 ACPI_S3PT_HEADER *SubTable; 2455 ACPI_DMTABLE_INFO *InfoTable; 2456 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); 2457 2458 2459 /* Main table */ 2460 2461 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt); 2462 if (ACPI_FAILURE (Status)) 2463 { 2464 return 0; 2465 } 2466 2467 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset); 2468 while (Offset < S3ptTable->Length) 2469 { 2470 /* Common subtable header */ 2471 2472 AcpiOsPrintf ("\n"); 2473 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 2474 SubTable->Length, AcpiDmTableInfoS3ptHdr); 2475 if (ACPI_FAILURE (Status)) 2476 { 2477 return 0; 2478 } 2479 2480 switch (SubTable->Type) 2481 { 2482 case ACPI_S3PT_TYPE_RESUME: 2483 2484 InfoTable = AcpiDmTableInfoS3pt0; 2485 break; 2486 2487 case ACPI_S3PT_TYPE_SUSPEND: 2488 2489 InfoTable = AcpiDmTableInfoS3pt1; 2490 break; 2491 2492 default: 2493 2494 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", SubTable->Type); 2495 2496 /* Attempt to continue */ 2497 2498 if (!SubTable->Length) 2499 { 2500 AcpiOsPrintf ("Invalid zero length subtable\n"); 2501 return 0; 2502 } 2503 goto NextSubTable; 2504 } 2505 2506 AcpiOsPrintf ("\n"); 2507 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, 2508 SubTable->Length, InfoTable); 2509 if (ACPI_FAILURE (Status)) 2510 { 2511 return 0; 2512 } 2513 2514 NextSubTable: 2515 /* Point to next subtable */ 2516 2517 Offset += SubTable->Length; 2518 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length); 2519 } 2520 2521 return (S3ptTable->Length); 2522 } 2523 2524 2525 /******************************************************************************* 2526 * 2527 * FUNCTION: AcpiDmDumpSlic 2528 * 2529 * PARAMETERS: Table - A SLIC table 2530 * 2531 * RETURN: None 2532 * 2533 * DESCRIPTION: Format the contents of a SLIC 2534 * 2535 ******************************************************************************/ 2536 2537 void 2538 AcpiDmDumpSlic ( 2539 ACPI_TABLE_HEADER *Table) 2540 { 2541 AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table, 2542 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic); 2543 } 2544 2545 2546 /******************************************************************************* 2547 * 2548 * FUNCTION: AcpiDmDumpSlit 2549 * 2550 * PARAMETERS: Table - An SLIT 2551 * 2552 * RETURN: None 2553 * 2554 * DESCRIPTION: Format the contents of a SLIT 2555 * 2556 ******************************************************************************/ 2557 2558 void 2559 AcpiDmDumpSlit ( 2560 ACPI_TABLE_HEADER *Table) 2561 { 2562 ACPI_STATUS Status; 2563 UINT32 Offset; 2564 UINT8 *Row; 2565 UINT32 Localities; 2566 UINT32 i; 2567 UINT32 j; 2568 2569 2570 /* Main table */ 2571 2572 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 2573 if (ACPI_FAILURE (Status)) 2574 { 2575 return; 2576 } 2577 2578 /* Display the Locality NxN Matrix */ 2579 2580 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 2581 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 2582 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 2583 2584 for (i = 0; i < Localities; i++) 2585 { 2586 /* Display one row of the matrix */ 2587 2588 AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 2589 for (j = 0; j < Localities; j++) 2590 { 2591 /* Check for beyond EOT */ 2592 2593 if (Offset >= Table->Length) 2594 { 2595 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n"); 2596 return; 2597 } 2598 2599 AcpiOsPrintf ("%2.2X", Row[j]); 2600 Offset++; 2601 2602 /* Display up to 16 bytes per output row */ 2603 2604 if ((j+1) < Localities) 2605 { 2606 AcpiOsPrintf (" "); 2607 2608 if (j && (((j+1) % 16) == 0)) 2609 { 2610 AcpiOsPrintf ("\\\n"); /* With line continuation char */ 2611 AcpiDmLineHeader (Offset, 0, NULL); 2612 } 2613 } 2614 } 2615 2616 /* Point to next row */ 2617 2618 AcpiOsPrintf ("\n"); 2619 Row += Localities; 2620 } 2621 } 2622 2623 2624 /******************************************************************************* 2625 * 2626 * FUNCTION: AcpiDmDumpSrat 2627 * 2628 * PARAMETERS: Table - A SRAT table 2629 * 2630 * RETURN: None 2631 * 2632 * DESCRIPTION: Format the contents of a SRAT 2633 * 2634 ******************************************************************************/ 2635 2636 void 2637 AcpiDmDumpSrat ( 2638 ACPI_TABLE_HEADER *Table) 2639 { 2640 ACPI_STATUS Status; 2641 UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 2642 ACPI_SUBTABLE_HEADER *SubTable; 2643 ACPI_DMTABLE_INFO *InfoTable; 2644 2645 2646 /* Main table */ 2647 2648 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 2649 if (ACPI_FAILURE (Status)) 2650 { 2651 return; 2652 } 2653 2654 /* Subtables */ 2655 2656 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 2657 while (Offset < Table->Length) 2658 { 2659 /* Common subtable header */ 2660 2661 AcpiOsPrintf ("\n"); 2662 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2663 SubTable->Length, AcpiDmTableInfoSratHdr); 2664 if (ACPI_FAILURE (Status)) 2665 { 2666 return; 2667 } 2668 2669 switch (SubTable->Type) 2670 { 2671 case ACPI_SRAT_TYPE_CPU_AFFINITY: 2672 2673 InfoTable = AcpiDmTableInfoSrat0; 2674 break; 2675 2676 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 2677 2678 InfoTable = AcpiDmTableInfoSrat1; 2679 break; 2680 2681 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 2682 2683 InfoTable = AcpiDmTableInfoSrat2; 2684 break; 2685 2686 case ACPI_SRAT_TYPE_GICC_AFFINITY: 2687 2688 InfoTable = AcpiDmTableInfoSrat3; 2689 break; 2690 2691 default: 2692 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", SubTable->Type); 2693 2694 /* Attempt to continue */ 2695 2696 if (!SubTable->Length) 2697 { 2698 AcpiOsPrintf ("Invalid zero length subtable\n"); 2699 return; 2700 } 2701 goto NextSubTable; 2702 } 2703 2704 AcpiOsPrintf ("\n"); 2705 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2706 SubTable->Length, InfoTable); 2707 if (ACPI_FAILURE (Status)) 2708 { 2709 return; 2710 } 2711 2712 NextSubTable: 2713 /* Point to next subtable */ 2714 2715 Offset += SubTable->Length; 2716 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length); 2717 } 2718 } 2719 2720 2721 /******************************************************************************* 2722 * 2723 * FUNCTION: AcpiDmDumpVrtc 2724 * 2725 * PARAMETERS: Table - A VRTC table 2726 * 2727 * RETURN: None 2728 * 2729 * DESCRIPTION: Format the contents of a VRTC 2730 * 2731 ******************************************************************************/ 2732 2733 void 2734 AcpiDmDumpVrtc ( 2735 ACPI_TABLE_HEADER *Table) 2736 { 2737 ACPI_STATUS Status; 2738 UINT32 Offset = sizeof (ACPI_TABLE_VRTC); 2739 ACPI_VRTC_ENTRY *SubTable; 2740 2741 2742 /* Main table */ 2743 2744 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc); 2745 if (ACPI_FAILURE (Status)) 2746 { 2747 return; 2748 } 2749 2750 /* Subtables */ 2751 2752 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); 2753 while (Offset < Table->Length) 2754 { 2755 /* Common subtable header */ 2756 2757 AcpiOsPrintf ("\n"); 2758 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2759 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0); 2760 if (ACPI_FAILURE (Status)) 2761 { 2762 return; 2763 } 2764 2765 /* Point to next subtable */ 2766 2767 Offset += sizeof (ACPI_VRTC_ENTRY); 2768 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY)); 2769 } 2770 } 2771 2772 2773 /******************************************************************************* 2774 * 2775 * FUNCTION: AcpiDmDumpWdat 2776 * 2777 * PARAMETERS: Table - A WDAT table 2778 * 2779 * RETURN: None 2780 * 2781 * DESCRIPTION: Format the contents of a WDAT 2782 * 2783 ******************************************************************************/ 2784 2785 void 2786 AcpiDmDumpWdat ( 2787 ACPI_TABLE_HEADER *Table) 2788 { 2789 ACPI_STATUS Status; 2790 UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 2791 ACPI_WDAT_ENTRY *SubTable; 2792 2793 2794 /* Main table */ 2795 2796 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 2797 if (ACPI_FAILURE (Status)) 2798 { 2799 return; 2800 } 2801 2802 /* Subtables */ 2803 2804 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 2805 while (Offset < Table->Length) 2806 { 2807 /* Common subtable header */ 2808 2809 AcpiOsPrintf ("\n"); 2810 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, 2811 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 2812 if (ACPI_FAILURE (Status)) 2813 { 2814 return; 2815 } 2816 2817 /* Point to next subtable */ 2818 2819 Offset += sizeof (ACPI_WDAT_ENTRY); 2820 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY)); 2821 } 2822 } 2823