1 /******************************************************************************
3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2012, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
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.
49 /* This module used for application-level code only */
51 #define _COMPONENT ACPI_CA_DISASSEMBLER
52 ACPI_MODULE_NAME ("dmtbdump")
55 /* Local prototypes */
58 AcpiDmValidateFadtLength (
67 UINT32 AbsoluteOffset,
71 /*******************************************************************************
73 * FUNCTION: AcpiDmDumpBuffer
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
84 * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
85 * disassembler output format.)
87 ******************************************************************************/
94 UINT32 AbsoluteOffset,
106 Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
114 AcpiDmLineHeader (AbsoluteOffset,
115 ((Length - i) > 16) ? 16 : (Length - i), Header);
119 AcpiOsPrintf ("%.02X ", *Buffer);
129 /*******************************************************************************
131 * FUNCTION: AcpiDmDumpRsdp
133 * PARAMETERS: Table - A RSDP
135 * RETURN: Length of the table (there is not always a length field,
136 * use revision or length if available (ACPI 2.0+))
138 * DESCRIPTION: Format the contents of a RSDP
140 ******************************************************************************/
144 ACPI_TABLE_HEADER *Table)
146 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
147 UINT32 Length = sizeof (ACPI_RSDP_COMMON);
151 /* Dump the common ACPI 1.0 portion */
153 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
155 /* Validate the first checksum */
157 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
159 if (Checksum != Rsdp->Checksum)
161 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
165 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
167 if (Rsdp->Revision > 0)
169 Length = Rsdp->Length;
170 AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
172 /* Validate the extended checksum over entire RSDP */
174 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
175 Rsdp->ExtendedChecksum);
176 if (Checksum != Rsdp->ExtendedChecksum)
179 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
188 /*******************************************************************************
190 * FUNCTION: AcpiDmDumpRsdt
192 * PARAMETERS: Table - A RSDT
196 * DESCRIPTION: Format the contents of a RSDT
198 ******************************************************************************/
202 ACPI_TABLE_HEADER *Table)
210 /* Point to start of table pointer array */
212 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
213 Offset = sizeof (ACPI_TABLE_HEADER);
215 /* RSDT uses 32-bit pointers */
217 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
219 for (i = 0; i < Entries; i++)
221 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
222 AcpiOsPrintf ("%8.8X\n", Array[i]);
223 Offset += sizeof (UINT32);
228 /*******************************************************************************
230 * FUNCTION: AcpiDmDumpXsdt
232 * PARAMETERS: Table - A XSDT
236 * DESCRIPTION: Format the contents of a XSDT
238 ******************************************************************************/
242 ACPI_TABLE_HEADER *Table)
250 /* Point to start of table pointer array */
252 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
253 Offset = sizeof (ACPI_TABLE_HEADER);
255 /* XSDT uses 64-bit pointers */
257 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
259 for (i = 0; i < Entries; i++)
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);
268 /*******************************************************************************
270 * FUNCTION: AcpiDmDumpFadt
272 * PARAMETERS: Table - A FADT
276 * DESCRIPTION: Format the contents of a FADT
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.
282 ******************************************************************************/
286 ACPI_TABLE_HEADER *Table)
289 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
291 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
293 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
295 if ((Table->Length > ACPI_FADT_V1_SIZE) &&
296 (Table->Length <= ACPI_FADT_V2_SIZE))
298 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
301 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
303 else if (Table->Length > ACPI_FADT_V2_SIZE)
305 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
307 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
309 if (Table->Length > ACPI_FADT_V3_SIZE)
311 AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
315 /* Validate various fields in the FADT, including length */
317 AcpiTbCreateLocalFadt (Table, Table->Length);
319 /* Validate FADT length against the revision */
321 AcpiDmValidateFadtLength (Table->Revision, Table->Length);
325 /*******************************************************************************
327 * FUNCTION: AcpiDmValidateFadtLength
329 * PARAMETERS: Revision - FADT revision (Header->Revision)
330 * Length - FADT length (Header->Length
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.
339 ******************************************************************************/
342 AcpiDmValidateFadtLength (
346 UINT32 ExpectedLength;
352 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
356 ExpectedLength = ACPI_FADT_V1_SIZE;
360 ExpectedLength = ACPI_FADT_V2_SIZE;
365 ExpectedLength = ACPI_FADT_V3_SIZE;
369 ExpectedLength = ACPI_FADT_V5_SIZE;
376 if (Length == ExpectedLength)
382 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
383 Revision, Length, ExpectedLength);
387 /*******************************************************************************
389 * FUNCTION: AcpiDmDumpAsf
391 * PARAMETERS: Table - A ASF table
395 * DESCRIPTION: Format the contents of a ASF table
397 ******************************************************************************/
401 ACPI_TABLE_HEADER *Table)
404 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
405 ACPI_ASF_INFO *SubTable;
406 ACPI_DMTABLE_INFO *InfoTable;
407 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
408 UINT8 *DataTable = NULL;
409 UINT32 DataCount = 0;
410 UINT32 DataLength = 0;
411 UINT32 DataOffset = 0;
416 /* No main table, only sub-tables */
418 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
419 while (Offset < Table->Length)
421 /* Common sub-table header */
423 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
424 SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
425 if (ACPI_FAILURE (Status))
430 /* The actual type is the lower 7 bits of Type */
432 Type = (UINT8) (SubTable->Header.Type & 0x7F);
436 case ACPI_ASF_TYPE_INFO:
437 InfoTable = AcpiDmTableInfoAsf0;
440 case ACPI_ASF_TYPE_ALERT:
441 InfoTable = AcpiDmTableInfoAsf1;
442 DataInfoTable = AcpiDmTableInfoAsf1a;
443 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
444 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
445 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
446 DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
449 case ACPI_ASF_TYPE_CONTROL:
450 InfoTable = AcpiDmTableInfoAsf2;
451 DataInfoTable = AcpiDmTableInfoAsf2a;
452 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
453 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
454 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
455 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
458 case ACPI_ASF_TYPE_BOOT:
459 InfoTable = AcpiDmTableInfoAsf3;
462 case ACPI_ASF_TYPE_ADDRESS:
463 InfoTable = AcpiDmTableInfoAsf4;
464 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
465 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
466 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
470 AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type);
474 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
475 SubTable->Header.Length, InfoTable);
476 if (ACPI_FAILURE (Status))
481 /* Dump variable-length extra data */
485 case ACPI_ASF_TYPE_ALERT:
486 case ACPI_ASF_TYPE_CONTROL:
488 for (i = 0; i < DataCount; i++)
491 Status = AcpiDmDumpTable (Table->Length, DataOffset,
492 DataTable, DataLength, DataInfoTable);
493 if (ACPI_FAILURE (Status))
498 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
499 DataOffset += DataLength;
503 case ACPI_ASF_TYPE_ADDRESS:
505 for (i = 0; i < DataLength; i++)
509 AcpiDmLineHeader (DataOffset, 1, "Addresses");
512 AcpiOsPrintf ("%2.2X ", *DataTable);
515 if (DataOffset > Table->Length)
517 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
531 /* Point to next sub-table */
533 if (!SubTable->Header.Length)
535 AcpiOsPrintf ("Invalid zero subtable header length\n");
539 Offset += SubTable->Header.Length;
540 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
545 /*******************************************************************************
547 * FUNCTION: AcpiDmDumpCpep
549 * PARAMETERS: Table - A CPEP table
553 * DESCRIPTION: Format the contents of a CPEP. This table type consists
554 * of an open-ended number of subtables.
556 ******************************************************************************/
560 ACPI_TABLE_HEADER *Table)
563 ACPI_CPEP_POLLING *SubTable;
564 UINT32 Length = Table->Length;
565 UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
570 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
571 if (ACPI_FAILURE (Status))
578 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
579 while (Offset < Table->Length)
582 Status = AcpiDmDumpTable (Length, Offset, SubTable,
583 SubTable->Header.Length, AcpiDmTableInfoCpep0);
584 if (ACPI_FAILURE (Status))
589 /* Point to next sub-table */
591 Offset += SubTable->Header.Length;
592 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
593 SubTable->Header.Length);
598 /*******************************************************************************
600 * FUNCTION: AcpiDmDumpCsrt
602 * PARAMETERS: Table - A CSRT table
606 * DESCRIPTION: Format the contents of a CSRT. This table type consists
607 * of an open-ended number of subtables.
609 ******************************************************************************/
613 ACPI_TABLE_HEADER *Table)
616 ACPI_CSRT_GROUP *SubTable;
617 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
618 ACPI_CSRT_DESCRIPTOR *SubSubTable;
619 UINT32 Length = Table->Length;
620 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
626 /* The main table only contains the ACPI header, thus already handled */
628 /* Sub-tables (Resource Groups) */
630 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
631 while (Offset < Table->Length)
633 /* Resource group subtable */
636 Status = AcpiDmDumpTable (Length, Offset, SubTable,
637 SubTable->Length, AcpiDmTableInfoCsrt0);
638 if (ACPI_FAILURE (Status))
643 /* Shared info subtable (One per resource group) */
645 SubOffset = sizeof (ACPI_CSRT_GROUP);
646 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
650 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
651 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
652 if (ACPI_FAILURE (Status))
657 SubOffset += SubTable->SharedInfoLength;
659 /* Sub-Subtables (Resource Descriptors) */
661 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
664 while ((SubOffset < SubTable->Length) &&
665 ((Offset + SubOffset) < Table->Length))
668 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
669 SubSubTable->Length, AcpiDmTableInfoCsrt2);
670 if (ACPI_FAILURE (Status))
675 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
677 /* Resource-specific info buffer */
679 InfoLength = SubSubTable->Length - SubSubOffset;
681 AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
682 Offset + SubOffset + SubSubOffset, "ResourceInfo");
683 SubSubOffset += InfoLength;
685 /* Point to next sub-subtable */
687 SubOffset += SubSubTable->Length;
688 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
689 SubSubTable->Length);
692 /* Point to next sub-table */
694 Offset += SubTable->Length;
695 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
701 /*******************************************************************************
703 * FUNCTION: AcpiDmDumpDbg2
705 * PARAMETERS: Table - A DBG2 table
709 * DESCRIPTION: Format the contents of a DBG2. This table type consists
710 * of an open-ended number of subtables.
712 ******************************************************************************/
716 ACPI_TABLE_HEADER *Table)
719 ACPI_DBG2_DEVICE *SubTable;
720 UINT32 Length = Table->Length;
721 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
724 UINT32 AbsoluteOffset;
730 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
731 if (ACPI_FAILURE (Status))
738 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
739 while (Offset < Table->Length)
742 Status = AcpiDmDumpTable (Length, Offset, SubTable,
743 SubTable->Length, AcpiDmTableInfoDbg2Device);
744 if (ACPI_FAILURE (Status))
749 /* Dump the BaseAddress array */
751 for (i = 0; i < SubTable->RegisterCount; i++)
753 ArrayOffset = SubTable->BaseAddressOffset +
754 (sizeof (ACPI_GENERIC_ADDRESS) * i);
755 AbsoluteOffset = Offset + ArrayOffset;
756 Array = (UINT8 *) SubTable + ArrayOffset;
758 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
759 SubTable->Length, AcpiDmTableInfoDbg2Addr);
760 if (ACPI_FAILURE (Status))
766 /* Dump the AddressSize array */
768 for (i = 0; i < SubTable->RegisterCount; i++)
770 ArrayOffset = SubTable->AddressSizeOffset +
771 (sizeof (UINT32) * i);
772 AbsoluteOffset = Offset + ArrayOffset;
773 Array = (UINT8 *) SubTable + ArrayOffset;
775 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
776 SubTable->Length, AcpiDmTableInfoDbg2Size);
777 if (ACPI_FAILURE (Status))
783 /* Dump the Namestring (required) */
786 ArrayOffset = SubTable->NamepathOffset;
787 AbsoluteOffset = Offset + ArrayOffset;
788 Array = (UINT8 *) SubTable + ArrayOffset;
790 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
791 SubTable->Length, AcpiDmTableInfoDbg2Name);
792 if (ACPI_FAILURE (Status))
797 /* Dump the OemData (optional) */
799 AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
800 Offset + SubTable->OemDataOffset, "OEM Data");
802 /* Point to next sub-table */
804 Offset += SubTable->Length;
805 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
811 /*******************************************************************************
813 * FUNCTION: AcpiDmDumpDmar
815 * PARAMETERS: Table - A DMAR table
819 * DESCRIPTION: Format the contents of a DMAR. This table type consists
820 * of an open-ended number of subtables.
822 ******************************************************************************/
827 ACPI_TABLE_HEADER *Table)
830 ACPI_DMAR_HEADER *SubTable;
831 UINT32 Length = Table->Length;
832 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
833 ACPI_DMTABLE_INFO *InfoTable;
834 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
842 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
843 if (ACPI_FAILURE (Status))
850 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
851 while (Offset < Table->Length)
853 /* Common sub-table header */
856 Status = AcpiDmDumpTable (Length, Offset, SubTable,
857 SubTable->Length, AcpiDmTableInfoDmarHdr);
858 if (ACPI_FAILURE (Status))
863 switch (SubTable->Type)
865 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
866 InfoTable = AcpiDmTableInfoDmar0;
867 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
869 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
870 InfoTable = AcpiDmTableInfoDmar1;
871 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
873 case ACPI_DMAR_TYPE_ATSR:
874 InfoTable = AcpiDmTableInfoDmar2;
875 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
877 case ACPI_DMAR_HARDWARE_AFFINITY:
878 InfoTable = AcpiDmTableInfoDmar3;
879 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
882 AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type);
886 Status = AcpiDmDumpTable (Length, Offset, SubTable,
887 SubTable->Length, InfoTable);
888 if (ACPI_FAILURE (Status))
893 /* Dump the device scope entries (if any) */
895 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
896 while (ScopeOffset < SubTable->Length)
899 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
900 ScopeTable->Length, AcpiDmTableInfoDmarScope);
901 if (ACPI_FAILURE (Status))
906 /* Dump the PCI Path entries for this device scope */
908 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
910 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
911 sizeof (ACPI_DMAR_DEVICE_SCOPE));
913 while (PathOffset < ScopeTable->Length)
915 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
916 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
918 /* Point to next PCI Path entry */
924 /* Point to next device scope entry */
926 ScopeOffset += ScopeTable->Length;
927 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
928 ScopeTable, ScopeTable->Length);
931 /* Point to next sub-table */
933 Offset += SubTable->Length;
934 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
939 /*******************************************************************************
941 * FUNCTION: AcpiDmDumpEinj
943 * PARAMETERS: Table - A EINJ table
947 * DESCRIPTION: Format the contents of a EINJ. This table type consists
948 * of an open-ended number of subtables.
950 ******************************************************************************/
954 ACPI_TABLE_HEADER *Table)
957 ACPI_WHEA_HEADER *SubTable;
958 UINT32 Length = Table->Length;
959 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
964 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
965 if (ACPI_FAILURE (Status))
972 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
973 while (Offset < Table->Length)
976 Status = AcpiDmDumpTable (Length, Offset, SubTable,
977 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
978 if (ACPI_FAILURE (Status))
983 /* Point to next sub-table (each subtable is of fixed length) */
985 Offset += sizeof (ACPI_WHEA_HEADER);
986 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
987 sizeof (ACPI_WHEA_HEADER));
992 /*******************************************************************************
994 * FUNCTION: AcpiDmDumpErst
996 * PARAMETERS: Table - A ERST table
1000 * DESCRIPTION: Format the contents of a ERST. This table type consists
1001 * of an open-ended number of subtables.
1003 ******************************************************************************/
1007 ACPI_TABLE_HEADER *Table)
1010 ACPI_WHEA_HEADER *SubTable;
1011 UINT32 Length = Table->Length;
1012 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
1017 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1018 if (ACPI_FAILURE (Status))
1025 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1026 while (Offset < Table->Length)
1028 AcpiOsPrintf ("\n");
1029 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1030 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1031 if (ACPI_FAILURE (Status))
1036 /* Point to next sub-table (each subtable is of fixed length) */
1038 Offset += sizeof (ACPI_WHEA_HEADER);
1039 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1040 sizeof (ACPI_WHEA_HEADER));
1045 /*******************************************************************************
1047 * FUNCTION: AcpiDmDumpFpdt
1049 * PARAMETERS: Table - A FPDT table
1053 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1054 * of an open-ended number of subtables.
1056 ******************************************************************************/
1060 ACPI_TABLE_HEADER *Table)
1063 ACPI_FPDT_HEADER *SubTable;
1064 UINT32 Length = Table->Length;
1065 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1066 ACPI_DMTABLE_INFO *InfoTable;
1069 /* There is no main table (other than the standard ACPI header) */
1073 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1074 while (Offset < Table->Length)
1076 /* Common sub-table header */
1078 AcpiOsPrintf ("\n");
1079 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1080 SubTable->Length, AcpiDmTableInfoFpdtHdr);
1081 if (ACPI_FAILURE (Status))
1086 switch (SubTable->Type)
1088 case ACPI_FPDT_TYPE_BOOT:
1089 InfoTable = AcpiDmTableInfoFpdt0;
1091 case ACPI_FPDT_TYPE_S3PERF:
1092 InfoTable = AcpiDmTableInfoFpdt1;
1095 AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type);
1097 /* Attempt to continue */
1099 if (!SubTable->Length)
1101 AcpiOsPrintf ("Invalid zero length subtable\n");
1107 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1108 SubTable->Length, InfoTable);
1109 if (ACPI_FAILURE (Status))
1115 /* Point to next sub-table */
1117 Offset += SubTable->Length;
1118 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1123 /*******************************************************************************
1125 * FUNCTION: AcpiDmDumpHest
1127 * PARAMETERS: Table - A HEST table
1131 * DESCRIPTION: Format the contents of a HEST. This table type consists
1132 * of an open-ended number of subtables.
1134 ******************************************************************************/
1138 ACPI_TABLE_HEADER *Table)
1141 ACPI_HEST_HEADER *SubTable;
1142 UINT32 Length = Table->Length;
1143 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1144 ACPI_DMTABLE_INFO *InfoTable;
1145 UINT32 SubTableLength;
1147 ACPI_HEST_IA_ERROR_BANK *BankTable;
1152 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1153 if (ACPI_FAILURE (Status))
1160 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1161 while (Offset < Table->Length)
1164 switch (SubTable->Type)
1166 case ACPI_HEST_TYPE_IA32_CHECK:
1167 InfoTable = AcpiDmTableInfoHest0;
1168 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1169 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1170 SubTable))->NumHardwareBanks;
1173 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1174 InfoTable = AcpiDmTableInfoHest1;
1175 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1176 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1177 SubTable))->NumHardwareBanks;
1180 case ACPI_HEST_TYPE_IA32_NMI:
1181 InfoTable = AcpiDmTableInfoHest2;
1182 SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1185 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1186 InfoTable = AcpiDmTableInfoHest6;
1187 SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1190 case ACPI_HEST_TYPE_AER_ENDPOINT:
1191 InfoTable = AcpiDmTableInfoHest7;
1192 SubTableLength = sizeof (ACPI_HEST_AER);
1195 case ACPI_HEST_TYPE_AER_BRIDGE:
1196 InfoTable = AcpiDmTableInfoHest8;
1197 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1200 case ACPI_HEST_TYPE_GENERIC_ERROR:
1201 InfoTable = AcpiDmTableInfoHest9;
1202 SubTableLength = sizeof (ACPI_HEST_GENERIC);
1206 /* Cannot continue on unknown type - no length */
1208 AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type);
1212 AcpiOsPrintf ("\n");
1213 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1214 SubTableLength, InfoTable);
1215 if (ACPI_FAILURE (Status))
1220 /* Point to end of current subtable (each subtable above is of fixed length) */
1222 Offset += SubTableLength;
1224 /* If there are any (fixed-length) Error Banks from above, dump them now */
1228 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1229 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1233 AcpiOsPrintf ("\n");
1234 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1235 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1236 if (ACPI_FAILURE (Status))
1240 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1246 /* Point to next sub-table */
1248 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1253 /*******************************************************************************
1255 * FUNCTION: AcpiDmDumpIvrs
1257 * PARAMETERS: Table - A IVRS table
1261 * DESCRIPTION: Format the contents of a IVRS
1263 ******************************************************************************/
1265 static UINT8 EntrySizes[] = {4,8,16,32};
1269 ACPI_TABLE_HEADER *Table)
1272 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
1276 ACPI_IVRS_DE_HEADER *DeviceEntry;
1277 ACPI_IVRS_HEADER *SubTable;
1278 ACPI_DMTABLE_INFO *InfoTable;
1283 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1284 if (ACPI_FAILURE (Status))
1291 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1292 while (Offset < Table->Length)
1294 /* Common sub-table header */
1296 AcpiOsPrintf ("\n");
1297 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1298 SubTable->Length, AcpiDmTableInfoIvrsHdr);
1299 if (ACPI_FAILURE (Status))
1304 switch (SubTable->Type)
1306 case ACPI_IVRS_TYPE_HARDWARE:
1307 InfoTable = AcpiDmTableInfoIvrs0;
1309 case ACPI_IVRS_TYPE_MEMORY1:
1310 case ACPI_IVRS_TYPE_MEMORY2:
1311 case ACPI_IVRS_TYPE_MEMORY3:
1312 InfoTable = AcpiDmTableInfoIvrs1;
1315 AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
1318 /* Attempt to continue */
1320 if (!SubTable->Length)
1322 AcpiOsPrintf ("Invalid zero length subtable\n");
1328 /* Dump the subtable */
1330 AcpiOsPrintf ("\n");
1331 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1332 SubTable->Length, InfoTable);
1333 if (ACPI_FAILURE (Status))
1338 /* The hardware subtable can contain multiple device entries */
1340 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1342 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1343 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1344 sizeof (ACPI_IVRS_HARDWARE));
1346 while (EntryOffset < (Offset + SubTable->Length))
1348 AcpiOsPrintf ("\n");
1350 * Upper 2 bits of Type encode the length of the device entry
1354 * 10 = 16 byte - currently no entries defined
1355 * 11 = 32 byte - currently no entries defined
1357 EntryType = DeviceEntry->Type;
1358 EntryLength = EntrySizes [EntryType >> 6];
1362 /* 4-byte device entries */
1364 case ACPI_IVRS_TYPE_PAD4:
1365 case ACPI_IVRS_TYPE_ALL:
1366 case ACPI_IVRS_TYPE_SELECT:
1367 case ACPI_IVRS_TYPE_START:
1368 case ACPI_IVRS_TYPE_END:
1370 InfoTable = AcpiDmTableInfoIvrs4;
1373 /* 8-byte entries, type A */
1375 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1376 case ACPI_IVRS_TYPE_ALIAS_START:
1378 InfoTable = AcpiDmTableInfoIvrs8a;
1381 /* 8-byte entries, type B */
1383 case ACPI_IVRS_TYPE_PAD8:
1384 case ACPI_IVRS_TYPE_EXT_SELECT:
1385 case ACPI_IVRS_TYPE_EXT_START:
1387 InfoTable = AcpiDmTableInfoIvrs8b;
1390 /* 8-byte entries, type C */
1392 case ACPI_IVRS_TYPE_SPECIAL:
1394 InfoTable = AcpiDmTableInfoIvrs8c;
1398 InfoTable = AcpiDmTableInfoIvrs4;
1400 "\n**** Unknown IVRS device entry type/length: "
1401 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1402 EntryType, EntryLength, EntryOffset);
1406 /* Dump the Device Entry */
1408 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1409 DeviceEntry, EntryLength, InfoTable);
1411 EntryOffset += EntryLength;
1412 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1418 /* Point to next sub-table */
1420 Offset += SubTable->Length;
1421 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1426 /*******************************************************************************
1428 * FUNCTION: AcpiDmDumpMadt
1430 * PARAMETERS: Table - A MADT table
1434 * DESCRIPTION: Format the contents of a MADT. This table type consists
1435 * of an open-ended number of subtables.
1437 ******************************************************************************/
1441 ACPI_TABLE_HEADER *Table)
1444 ACPI_SUBTABLE_HEADER *SubTable;
1445 UINT32 Length = Table->Length;
1446 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
1447 ACPI_DMTABLE_INFO *InfoTable;
1452 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1453 if (ACPI_FAILURE (Status))
1460 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1461 while (Offset < Table->Length)
1463 /* Common sub-table header */
1465 AcpiOsPrintf ("\n");
1466 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1467 SubTable->Length, AcpiDmTableInfoMadtHdr);
1468 if (ACPI_FAILURE (Status))
1473 switch (SubTable->Type)
1475 case ACPI_MADT_TYPE_LOCAL_APIC:
1476 InfoTable = AcpiDmTableInfoMadt0;
1478 case ACPI_MADT_TYPE_IO_APIC:
1479 InfoTable = AcpiDmTableInfoMadt1;
1481 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1482 InfoTable = AcpiDmTableInfoMadt2;
1484 case ACPI_MADT_TYPE_NMI_SOURCE:
1485 InfoTable = AcpiDmTableInfoMadt3;
1487 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1488 InfoTable = AcpiDmTableInfoMadt4;
1490 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1491 InfoTable = AcpiDmTableInfoMadt5;
1493 case ACPI_MADT_TYPE_IO_SAPIC:
1494 InfoTable = AcpiDmTableInfoMadt6;
1496 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1497 InfoTable = AcpiDmTableInfoMadt7;
1499 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1500 InfoTable = AcpiDmTableInfoMadt8;
1502 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1503 InfoTable = AcpiDmTableInfoMadt9;
1505 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1506 InfoTable = AcpiDmTableInfoMadt10;
1508 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1509 InfoTable = AcpiDmTableInfoMadt11;
1511 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1512 InfoTable = AcpiDmTableInfoMadt12;
1515 AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type);
1517 /* Attempt to continue */
1519 if (!SubTable->Length)
1521 AcpiOsPrintf ("Invalid zero length subtable\n");
1527 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1528 SubTable->Length, InfoTable);
1529 if (ACPI_FAILURE (Status))
1535 /* Point to next sub-table */
1537 Offset += SubTable->Length;
1538 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1543 /*******************************************************************************
1545 * FUNCTION: AcpiDmDumpMcfg
1547 * PARAMETERS: Table - A MCFG Table
1551 * DESCRIPTION: Format the contents of a MCFG table
1553 ******************************************************************************/
1557 ACPI_TABLE_HEADER *Table)
1560 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
1561 ACPI_MCFG_ALLOCATION *SubTable;
1566 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1567 if (ACPI_FAILURE (Status))
1574 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1575 while (Offset < Table->Length)
1577 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1579 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1580 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1584 AcpiOsPrintf ("\n");
1585 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1586 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1587 if (ACPI_FAILURE (Status))
1592 /* Point to next sub-table (each subtable is of fixed length) */
1594 Offset += sizeof (ACPI_MCFG_ALLOCATION);
1595 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1596 sizeof (ACPI_MCFG_ALLOCATION));
1601 /*******************************************************************************
1603 * FUNCTION: AcpiDmDumpMpst
1605 * PARAMETERS: Table - A MPST Table
1609 * DESCRIPTION: Format the contents of a MPST table
1611 ******************************************************************************/
1615 ACPI_TABLE_HEADER *Table)
1618 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
1619 ACPI_MPST_POWER_NODE *SubTable0;
1620 ACPI_MPST_POWER_STATE *SubTable0A;
1621 ACPI_MPST_COMPONENT *SubTable0B;
1622 ACPI_MPST_DATA_HDR *SubTable1;
1623 ACPI_MPST_POWER_DATA *SubTable2;
1624 UINT16 SubtableCount;
1625 UINT32 PowerStateCount;
1626 UINT32 ComponentCount;
1631 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1632 if (ACPI_FAILURE (Status))
1637 /* Subtable: Memory Power Node(s) */
1639 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1640 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1642 while ((Offset < Table->Length) && SubtableCount)
1644 AcpiOsPrintf ("\n");
1645 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
1646 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1647 if (ACPI_FAILURE (Status))
1652 /* Extract the sub-subtable counts */
1654 PowerStateCount = SubTable0->NumPowerStates;
1655 ComponentCount = SubTable0->NumPhysicalComponents;
1656 Offset += sizeof (ACPI_MPST_POWER_NODE);
1658 /* Sub-subtables - Memory Power State Structure(s) */
1660 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
1661 sizeof (ACPI_MPST_POWER_NODE));
1663 while (PowerStateCount)
1665 AcpiOsPrintf ("\n");
1666 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
1667 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1668 if (ACPI_FAILURE (Status))
1675 Offset += sizeof (ACPI_MPST_POWER_STATE);
1678 /* Sub-subtables - Physical Component ID Structure(s) */
1680 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
1684 AcpiOsPrintf ("\n");
1687 while (ComponentCount)
1689 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
1690 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1691 if (ACPI_FAILURE (Status))
1698 Offset += sizeof (ACPI_MPST_COMPONENT);
1701 /* Point to next Memory Power Node subtable */
1704 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
1705 sizeof (ACPI_MPST_POWER_NODE) +
1706 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
1707 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
1710 /* Subtable: Count of Memory Power State Characteristic structures */
1712 AcpiOsPrintf ("\n");
1713 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
1714 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
1715 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1716 if (ACPI_FAILURE (Status))
1721 SubtableCount = SubTable1->CharacteristicsCount;
1722 Offset += sizeof (ACPI_MPST_DATA_HDR);
1724 /* Subtable: Memory Power State Characteristics structure(s) */
1726 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
1728 while ((Offset < Table->Length) && SubtableCount)
1730 AcpiOsPrintf ("\n");
1731 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
1732 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1733 if (ACPI_FAILURE (Status))
1740 Offset += sizeof (ACPI_MPST_POWER_DATA);
1745 /*******************************************************************************
1747 * FUNCTION: AcpiDmDumpMsct
1749 * PARAMETERS: Table - A MSCT table
1753 * DESCRIPTION: Format the contents of a MSCT
1755 ******************************************************************************/
1759 ACPI_TABLE_HEADER *Table)
1762 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
1763 ACPI_MSCT_PROXIMITY *SubTable;
1768 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1769 if (ACPI_FAILURE (Status))
1776 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1777 while (Offset < Table->Length)
1779 /* Common sub-table header */
1781 AcpiOsPrintf ("\n");
1782 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1783 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1784 if (ACPI_FAILURE (Status))
1789 /* Point to next sub-table */
1791 Offset += sizeof (ACPI_MSCT_PROXIMITY);
1792 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
1797 /*******************************************************************************
1799 * FUNCTION: AcpiDmDumpPcct
1801 * PARAMETERS: Table - A PCCT table
1805 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1806 * of an open-ended number of subtables.
1808 ******************************************************************************/
1812 ACPI_TABLE_HEADER *Table)
1815 ACPI_PCCT_SUBSPACE *SubTable;
1816 UINT32 Length = Table->Length;
1817 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
1822 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1823 if (ACPI_FAILURE (Status))
1830 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1831 while (Offset < Table->Length)
1833 AcpiOsPrintf ("\n");
1834 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1835 SubTable->Header.Length, AcpiDmTableInfoPcct0);
1836 if (ACPI_FAILURE (Status))
1841 /* Point to next sub-table */
1843 Offset += SubTable->Header.Length;
1844 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
1845 SubTable->Header.Length);
1850 /*******************************************************************************
1852 * FUNCTION: AcpiDmDumpPmtt
1854 * PARAMETERS: Table - A PMTT table
1858 * DESCRIPTION: Format the contents of a PMTT. This table type consists
1859 * of an open-ended number of subtables.
1861 ******************************************************************************/
1865 ACPI_TABLE_HEADER *Table)
1868 ACPI_PMTT_HEADER *SubTable;
1869 ACPI_PMTT_HEADER *MemSubTable;
1870 ACPI_PMTT_HEADER *DimmSubTable;
1871 ACPI_PMTT_DOMAIN *DomainArray;
1872 UINT32 Length = Table->Length;
1873 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
1876 UINT32 DomainOffset;
1882 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1883 if (ACPI_FAILURE (Status))
1890 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1891 while (Offset < Table->Length)
1893 /* Common subtable header */
1895 AcpiOsPrintf ("\n");
1896 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1897 SubTable->Length, AcpiDmTableInfoPmttHdr);
1898 if (ACPI_FAILURE (Status))
1903 /* Only Socket subtables are expected at this level */
1905 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
1908 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1913 /* Dump the fixed-length portion of the subtable */
1915 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1916 SubTable->Length, AcpiDmTableInfoPmtt0);
1917 if (ACPI_FAILURE (Status))
1922 /* Walk the memory controller subtables */
1924 MemOffset = sizeof (ACPI_PMTT_SOCKET);
1925 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
1926 sizeof (ACPI_PMTT_SOCKET));
1928 while (((Offset + MemOffset) < Table->Length) &&
1929 (MemOffset < SubTable->Length))
1931 /* Common subtable header */
1933 AcpiOsPrintf ("\n");
1934 Status = AcpiDmDumpTable (Length,
1935 Offset + MemOffset, MemSubTable,
1936 MemSubTable->Length, AcpiDmTableInfoPmttHdr);
1937 if (ACPI_FAILURE (Status))
1942 /* Only memory controller subtables are expected at this level */
1944 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
1947 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1952 /* Dump the fixed-length portion of the controller subtable */
1954 Status = AcpiDmDumpTable (Length,
1955 Offset + MemOffset, MemSubTable,
1956 MemSubTable->Length, AcpiDmTableInfoPmtt1);
1957 if (ACPI_FAILURE (Status))
1962 /* Walk the variable count of proximity domains */
1964 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
1965 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
1966 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
1967 sizeof (ACPI_PMTT_CONTROLLER));
1969 while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
1970 ((MemOffset + DomainOffset) < SubTable->Length) &&
1973 Status = AcpiDmDumpTable (Length,
1974 Offset + MemOffset + DomainOffset, DomainArray,
1975 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
1976 if (ACPI_FAILURE (Status))
1981 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
1989 "\n**** DomainCount exceeds subtable length\n\n",
1993 /* Walk the physical component (DIMM) subtables */
1995 DimmOffset = DomainOffset;
1996 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
1999 while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
2000 (DimmOffset < MemSubTable->Length))
2002 /* Common subtable header */
2004 AcpiOsPrintf ("\n");
2005 Status = AcpiDmDumpTable (Length,
2006 Offset + MemOffset + DimmOffset, DimmSubTable,
2007 DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
2008 if (ACPI_FAILURE (Status))
2013 /* Only DIMM subtables are expected at this level */
2015 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2018 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2019 DimmSubTable->Type);
2023 /* Dump the fixed-length DIMM subtable */
2025 Status = AcpiDmDumpTable (Length,
2026 Offset + MemOffset + DimmOffset, DimmSubTable,
2027 DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2028 if (ACPI_FAILURE (Status))
2033 /* Point to next DIMM subtable */
2035 DimmOffset += DimmSubTable->Length;
2036 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2037 DimmSubTable, DimmSubTable->Length);
2040 /* Point to next Controller subtable */
2042 MemOffset += MemSubTable->Length;
2043 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2044 MemSubTable, MemSubTable->Length);
2047 /* Point to next Socket subtable */
2049 Offset += SubTable->Length;
2050 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2051 SubTable, SubTable->Length);
2056 /*******************************************************************************
2058 * FUNCTION: AcpiDmDumpS3pt
2060 * PARAMETERS: Table - A S3PT table
2062 * RETURN: Length of the table
2064 * DESCRIPTION: Format the contents of a S3PT
2066 ******************************************************************************/
2070 ACPI_TABLE_HEADER *Tables)
2073 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
2074 ACPI_S3PT_HEADER *SubTable;
2075 ACPI_DMTABLE_INFO *InfoTable;
2076 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2081 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2082 if (ACPI_FAILURE (Status))
2087 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
2088 while (Offset < S3ptTable->Length)
2090 /* Common sub-table header */
2092 AcpiOsPrintf ("\n");
2093 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2094 SubTable->Length, AcpiDmTableInfoS3ptHdr);
2095 if (ACPI_FAILURE (Status))
2100 switch (SubTable->Type)
2102 case ACPI_S3PT_TYPE_RESUME:
2103 InfoTable = AcpiDmTableInfoS3pt0;
2105 case ACPI_S3PT_TYPE_SUSPEND:
2106 InfoTable = AcpiDmTableInfoS3pt1;
2109 AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type);
2111 /* Attempt to continue */
2113 if (!SubTable->Length)
2115 AcpiOsPrintf ("Invalid zero length subtable\n");
2121 AcpiOsPrintf ("\n");
2122 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2123 SubTable->Length, InfoTable);
2124 if (ACPI_FAILURE (Status))
2130 /* Point to next sub-table */
2132 Offset += SubTable->Length;
2133 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
2136 return (S3ptTable->Length);
2140 /*******************************************************************************
2142 * FUNCTION: AcpiDmDumpSlic
2144 * PARAMETERS: Table - A SLIC table
2148 * DESCRIPTION: Format the contents of a SLIC
2150 ******************************************************************************/
2154 ACPI_TABLE_HEADER *Table)
2157 UINT32 Offset = sizeof (ACPI_TABLE_SLIC);
2158 ACPI_SLIC_HEADER *SubTable;
2159 ACPI_DMTABLE_INFO *InfoTable;
2162 /* There is no main SLIC table, only subtables */
2164 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
2165 while (Offset < Table->Length)
2167 /* Common sub-table header */
2169 AcpiOsPrintf ("\n");
2170 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2171 SubTable->Length, AcpiDmTableInfoSlicHdr);
2172 if (ACPI_FAILURE (Status))
2177 switch (SubTable->Type)
2179 case ACPI_SLIC_TYPE_PUBLIC_KEY:
2180 InfoTable = AcpiDmTableInfoSlic0;
2182 case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2183 InfoTable = AcpiDmTableInfoSlic1;
2186 AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type);
2188 /* Attempt to continue */
2190 if (!SubTable->Length)
2192 AcpiOsPrintf ("Invalid zero length subtable\n");
2198 AcpiOsPrintf ("\n");
2199 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2200 SubTable->Length, InfoTable);
2201 if (ACPI_FAILURE (Status))
2207 /* Point to next sub-table */
2209 Offset += SubTable->Length;
2210 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
2215 /*******************************************************************************
2217 * FUNCTION: AcpiDmDumpSlit
2219 * PARAMETERS: Table - An SLIT
2223 * DESCRIPTION: Format the contents of a SLIT
2225 ******************************************************************************/
2229 ACPI_TABLE_HEADER *Table)
2241 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
2242 if (ACPI_FAILURE (Status))
2247 /* Display the Locality NxN Matrix */
2249 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
2250 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
2251 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
2253 for (i = 0; i < Localities; i++)
2255 /* Display one row of the matrix */
2257 AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
2258 for (j = 0; j < Localities; j++)
2260 /* Check for beyond EOT */
2262 if (Offset >= Table->Length)
2264 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2268 AcpiOsPrintf ("%2.2X", Row[j]);
2271 /* Display up to 16 bytes per output row */
2273 if ((j+1) < Localities)
2277 if (j && (((j+1) % 16) == 0))
2279 AcpiOsPrintf ("\\\n"); /* With line continuation char */
2280 AcpiDmLineHeader (Offset, 0, NULL);
2285 /* Point to next row */
2287 AcpiOsPrintf ("\n");
2293 /*******************************************************************************
2295 * FUNCTION: AcpiDmDumpSrat
2297 * PARAMETERS: Table - A SRAT table
2301 * DESCRIPTION: Format the contents of a SRAT
2303 ******************************************************************************/
2307 ACPI_TABLE_HEADER *Table)
2310 UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
2311 ACPI_SUBTABLE_HEADER *SubTable;
2312 ACPI_DMTABLE_INFO *InfoTable;
2317 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
2318 if (ACPI_FAILURE (Status))
2325 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2326 while (Offset < Table->Length)
2328 /* Common sub-table header */
2330 AcpiOsPrintf ("\n");
2331 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2332 SubTable->Length, AcpiDmTableInfoSratHdr);
2333 if (ACPI_FAILURE (Status))
2338 switch (SubTable->Type)
2340 case ACPI_SRAT_TYPE_CPU_AFFINITY:
2341 InfoTable = AcpiDmTableInfoSrat0;
2343 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2344 InfoTable = AcpiDmTableInfoSrat1;
2346 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2347 InfoTable = AcpiDmTableInfoSrat2;
2350 AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type);
2352 /* Attempt to continue */
2354 if (!SubTable->Length)
2356 AcpiOsPrintf ("Invalid zero length subtable\n");
2362 AcpiOsPrintf ("\n");
2363 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2364 SubTable->Length, InfoTable);
2365 if (ACPI_FAILURE (Status))
2371 /* Point to next sub-table */
2373 Offset += SubTable->Length;
2374 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2379 /*******************************************************************************
2381 * FUNCTION: AcpiDmDumpWdat
2383 * PARAMETERS: Table - A WDAT table
2387 * DESCRIPTION: Format the contents of a WDAT
2389 ******************************************************************************/
2393 ACPI_TABLE_HEADER *Table)
2396 UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
2397 ACPI_WDAT_ENTRY *SubTable;
2402 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
2403 if (ACPI_FAILURE (Status))
2410 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
2411 while (Offset < Table->Length)
2413 /* Common sub-table header */
2415 AcpiOsPrintf ("\n");
2416 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2417 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
2418 if (ACPI_FAILURE (Status))
2423 /* Point to next sub-table */
2425 Offset += sizeof (ACPI_WDAT_ENTRY);
2426 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));