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