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.
44 #include <contrib/dev/acpica/include/acpi.h>
45 #include <contrib/dev/acpica/include/accommon.h>
46 #include <contrib/dev/acpica/include/acdisasm.h>
47 #include <contrib/dev/acpica/include/actables.h>
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_DESCRIPTOR *SubSubTable;
618 UINT32 Length = Table->Length;
619 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
625 /* The main table only contains the ACPI header, thus already handled */
627 /* Sub-tables (Resource Groups) */
629 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
630 while (Offset < Table->Length)
633 Status = AcpiDmDumpTable (Length, Offset, SubTable,
634 SubTable->Length, AcpiDmTableInfoCsrt0);
635 if (ACPI_FAILURE (Status))
640 SubOffset = sizeof (ACPI_CSRT_GROUP);
642 /* Shared resource group info buffer */
644 AcpiDmDumpBuffer (SubTable, SubOffset, SubTable->InfoLength,
645 Offset+SubOffset, "Shared Data");
646 SubOffset += SubTable->InfoLength;
648 /* Sub-Sub-tables (Resource Descriptors) */
650 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
653 while ((SubOffset < SubTable->Length) &&
654 ((Offset + SubOffset) < Table->Length))
657 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
658 SubSubTable->Length, AcpiDmTableInfoCsrt1);
659 if (ACPI_FAILURE (Status))
664 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
666 /* Resource-specific info buffer */
668 InfoLength = SubSubTable->Length - SubSubOffset;
670 AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
671 Offset + SubOffset + SubSubOffset, "ResourceInfo");
672 SubSubOffset += InfoLength;
674 /* Point to next sub-sub-table */
676 SubOffset += SubSubTable->Length;
677 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
678 SubSubTable->Length);
681 /* Point to next sub-table */
683 Offset += SubTable->Length;
684 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
690 /*******************************************************************************
692 * FUNCTION: AcpiDmDumpDbg2
694 * PARAMETERS: Table - A DBG2 table
698 * DESCRIPTION: Format the contents of a DBG2. This table type consists
699 * of an open-ended number of subtables.
701 ******************************************************************************/
705 ACPI_TABLE_HEADER *Table)
708 ACPI_DBG2_DEVICE *SubTable;
709 UINT32 Length = Table->Length;
710 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
713 UINT32 AbsoluteOffset;
719 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
720 if (ACPI_FAILURE (Status))
727 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
728 while (Offset < Table->Length)
731 Status = AcpiDmDumpTable (Length, Offset, SubTable,
732 SubTable->Length, AcpiDmTableInfoDbg2Device);
733 if (ACPI_FAILURE (Status))
738 /* Dump the BaseAddress array */
740 for (i = 0; i < SubTable->RegisterCount; i++)
742 ArrayOffset = SubTable->BaseAddressOffset +
743 (sizeof (ACPI_GENERIC_ADDRESS) * i);
744 AbsoluteOffset = Offset + ArrayOffset;
745 Array = (UINT8 *) SubTable + ArrayOffset;
747 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
748 SubTable->Length, AcpiDmTableInfoDbg2Addr);
749 if (ACPI_FAILURE (Status))
755 /* Dump the AddressSize array */
757 for (i = 0; i < SubTable->RegisterCount; i++)
759 ArrayOffset = SubTable->AddressSizeOffset +
760 (sizeof (UINT32) * i);
761 AbsoluteOffset = Offset + ArrayOffset;
762 Array = (UINT8 *) SubTable + ArrayOffset;
764 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
765 SubTable->Length, AcpiDmTableInfoDbg2Size);
766 if (ACPI_FAILURE (Status))
772 /* Dump the Namestring (required) */
775 ArrayOffset = SubTable->NamepathOffset;
776 AbsoluteOffset = Offset + ArrayOffset;
777 Array = (UINT8 *) SubTable + ArrayOffset;
779 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
780 SubTable->Length, AcpiDmTableInfoDbg2Name);
781 if (ACPI_FAILURE (Status))
786 /* Dump the OemData (optional) */
788 AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
789 Offset + SubTable->OemDataOffset, "OEM Data");
791 /* Point to next sub-table */
793 Offset += SubTable->Length;
794 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
800 /*******************************************************************************
802 * FUNCTION: AcpiDmDumpDmar
804 * PARAMETERS: Table - A DMAR table
808 * DESCRIPTION: Format the contents of a DMAR. This table type consists
809 * of an open-ended number of subtables.
811 ******************************************************************************/
816 ACPI_TABLE_HEADER *Table)
819 ACPI_DMAR_HEADER *SubTable;
820 UINT32 Length = Table->Length;
821 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
822 ACPI_DMTABLE_INFO *InfoTable;
823 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
831 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
832 if (ACPI_FAILURE (Status))
839 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
840 while (Offset < Table->Length)
842 /* Common sub-table header */
845 Status = AcpiDmDumpTable (Length, Offset, SubTable,
846 SubTable->Length, AcpiDmTableInfoDmarHdr);
847 if (ACPI_FAILURE (Status))
852 switch (SubTable->Type)
854 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
855 InfoTable = AcpiDmTableInfoDmar0;
856 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
858 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
859 InfoTable = AcpiDmTableInfoDmar1;
860 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
862 case ACPI_DMAR_TYPE_ATSR:
863 InfoTable = AcpiDmTableInfoDmar2;
864 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
866 case ACPI_DMAR_HARDWARE_AFFINITY:
867 InfoTable = AcpiDmTableInfoDmar3;
868 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
871 AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type);
875 Status = AcpiDmDumpTable (Length, Offset, SubTable,
876 SubTable->Length, InfoTable);
877 if (ACPI_FAILURE (Status))
882 /* Dump the device scope entries (if any) */
884 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
885 while (ScopeOffset < SubTable->Length)
888 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
889 ScopeTable->Length, AcpiDmTableInfoDmarScope);
890 if (ACPI_FAILURE (Status))
895 /* Dump the PCI Path entries for this device scope */
897 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
899 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
900 sizeof (ACPI_DMAR_DEVICE_SCOPE));
902 while (PathOffset < ScopeTable->Length)
904 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
905 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
907 /* Point to next PCI Path entry */
913 /* Point to next device scope entry */
915 ScopeOffset += ScopeTable->Length;
916 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
917 ScopeTable, ScopeTable->Length);
920 /* Point to next sub-table */
922 Offset += SubTable->Length;
923 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
928 /*******************************************************************************
930 * FUNCTION: AcpiDmDumpEinj
932 * PARAMETERS: Table - A EINJ table
936 * DESCRIPTION: Format the contents of a EINJ. This table type consists
937 * of an open-ended number of subtables.
939 ******************************************************************************/
943 ACPI_TABLE_HEADER *Table)
946 ACPI_WHEA_HEADER *SubTable;
947 UINT32 Length = Table->Length;
948 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
953 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
954 if (ACPI_FAILURE (Status))
961 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
962 while (Offset < Table->Length)
965 Status = AcpiDmDumpTable (Length, Offset, SubTable,
966 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
967 if (ACPI_FAILURE (Status))
972 /* Point to next sub-table (each subtable is of fixed length) */
974 Offset += sizeof (ACPI_WHEA_HEADER);
975 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
976 sizeof (ACPI_WHEA_HEADER));
981 /*******************************************************************************
983 * FUNCTION: AcpiDmDumpErst
985 * PARAMETERS: Table - A ERST table
989 * DESCRIPTION: Format the contents of a ERST. This table type consists
990 * of an open-ended number of subtables.
992 ******************************************************************************/
996 ACPI_TABLE_HEADER *Table)
999 ACPI_WHEA_HEADER *SubTable;
1000 UINT32 Length = Table->Length;
1001 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
1006 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1007 if (ACPI_FAILURE (Status))
1014 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1015 while (Offset < Table->Length)
1017 AcpiOsPrintf ("\n");
1018 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1019 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1020 if (ACPI_FAILURE (Status))
1025 /* Point to next sub-table (each subtable is of fixed length) */
1027 Offset += sizeof (ACPI_WHEA_HEADER);
1028 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1029 sizeof (ACPI_WHEA_HEADER));
1034 /*******************************************************************************
1036 * FUNCTION: AcpiDmDumpFpdt
1038 * PARAMETERS: Table - A FPDT table
1042 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1043 * of an open-ended number of subtables.
1045 ******************************************************************************/
1049 ACPI_TABLE_HEADER *Table)
1052 ACPI_FPDT_HEADER *SubTable;
1053 UINT32 Length = Table->Length;
1054 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1055 ACPI_DMTABLE_INFO *InfoTable;
1058 /* There is no main table (other than the standard ACPI header) */
1062 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1063 while (Offset < Table->Length)
1065 /* Common sub-table header */
1067 AcpiOsPrintf ("\n");
1068 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1069 SubTable->Length, AcpiDmTableInfoFpdtHdr);
1070 if (ACPI_FAILURE (Status))
1075 switch (SubTable->Type)
1077 case ACPI_FPDT_TYPE_BOOT:
1078 InfoTable = AcpiDmTableInfoFpdt0;
1080 case ACPI_FPDT_TYPE_S3PERF:
1081 InfoTable = AcpiDmTableInfoFpdt1;
1084 AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type);
1086 /* Attempt to continue */
1088 if (!SubTable->Length)
1090 AcpiOsPrintf ("Invalid zero length subtable\n");
1096 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1097 SubTable->Length, InfoTable);
1098 if (ACPI_FAILURE (Status))
1104 /* Point to next sub-table */
1106 Offset += SubTable->Length;
1107 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1112 /*******************************************************************************
1114 * FUNCTION: AcpiDmDumpHest
1116 * PARAMETERS: Table - A HEST table
1120 * DESCRIPTION: Format the contents of a HEST. This table type consists
1121 * of an open-ended number of subtables.
1123 ******************************************************************************/
1127 ACPI_TABLE_HEADER *Table)
1130 ACPI_HEST_HEADER *SubTable;
1131 UINT32 Length = Table->Length;
1132 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1133 ACPI_DMTABLE_INFO *InfoTable;
1134 UINT32 SubTableLength;
1136 ACPI_HEST_IA_ERROR_BANK *BankTable;
1141 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1142 if (ACPI_FAILURE (Status))
1149 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1150 while (Offset < Table->Length)
1153 switch (SubTable->Type)
1155 case ACPI_HEST_TYPE_IA32_CHECK:
1156 InfoTable = AcpiDmTableInfoHest0;
1157 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1158 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1159 SubTable))->NumHardwareBanks;
1162 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1163 InfoTable = AcpiDmTableInfoHest1;
1164 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1165 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1166 SubTable))->NumHardwareBanks;
1169 case ACPI_HEST_TYPE_IA32_NMI:
1170 InfoTable = AcpiDmTableInfoHest2;
1171 SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1174 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1175 InfoTable = AcpiDmTableInfoHest6;
1176 SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1179 case ACPI_HEST_TYPE_AER_ENDPOINT:
1180 InfoTable = AcpiDmTableInfoHest7;
1181 SubTableLength = sizeof (ACPI_HEST_AER);
1184 case ACPI_HEST_TYPE_AER_BRIDGE:
1185 InfoTable = AcpiDmTableInfoHest8;
1186 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1189 case ACPI_HEST_TYPE_GENERIC_ERROR:
1190 InfoTable = AcpiDmTableInfoHest9;
1191 SubTableLength = sizeof (ACPI_HEST_GENERIC);
1195 /* Cannot continue on unknown type - no length */
1197 AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type);
1201 AcpiOsPrintf ("\n");
1202 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1203 SubTableLength, InfoTable);
1204 if (ACPI_FAILURE (Status))
1209 /* Point to end of current subtable (each subtable above is of fixed length) */
1211 Offset += SubTableLength;
1213 /* If there are any (fixed-length) Error Banks from above, dump them now */
1217 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1218 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1222 AcpiOsPrintf ("\n");
1223 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1224 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1225 if (ACPI_FAILURE (Status))
1229 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1235 /* Point to next sub-table */
1237 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1242 /*******************************************************************************
1244 * FUNCTION: AcpiDmDumpIvrs
1246 * PARAMETERS: Table - A IVRS table
1250 * DESCRIPTION: Format the contents of a IVRS
1252 ******************************************************************************/
1254 static UINT8 EntrySizes[] = {4,8,16,32};
1258 ACPI_TABLE_HEADER *Table)
1261 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
1265 ACPI_IVRS_DE_HEADER *DeviceEntry;
1266 ACPI_IVRS_HEADER *SubTable;
1267 ACPI_DMTABLE_INFO *InfoTable;
1272 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1273 if (ACPI_FAILURE (Status))
1280 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1281 while (Offset < Table->Length)
1283 /* Common sub-table header */
1285 AcpiOsPrintf ("\n");
1286 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1287 SubTable->Length, AcpiDmTableInfoIvrsHdr);
1288 if (ACPI_FAILURE (Status))
1293 switch (SubTable->Type)
1295 case ACPI_IVRS_TYPE_HARDWARE:
1296 InfoTable = AcpiDmTableInfoIvrs0;
1298 case ACPI_IVRS_TYPE_MEMORY1:
1299 case ACPI_IVRS_TYPE_MEMORY2:
1300 case ACPI_IVRS_TYPE_MEMORY3:
1301 InfoTable = AcpiDmTableInfoIvrs1;
1304 AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
1307 /* Attempt to continue */
1309 if (!SubTable->Length)
1311 AcpiOsPrintf ("Invalid zero length subtable\n");
1317 /* Dump the subtable */
1319 AcpiOsPrintf ("\n");
1320 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1321 SubTable->Length, InfoTable);
1322 if (ACPI_FAILURE (Status))
1327 /* The hardware subtable can contain multiple device entries */
1329 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1331 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1332 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1333 sizeof (ACPI_IVRS_HARDWARE));
1335 while (EntryOffset < (Offset + SubTable->Length))
1337 AcpiOsPrintf ("\n");
1339 * Upper 2 bits of Type encode the length of the device entry
1343 * 10 = 16 byte - currently no entries defined
1344 * 11 = 32 byte - currently no entries defined
1346 EntryType = DeviceEntry->Type;
1347 EntryLength = EntrySizes [EntryType >> 6];
1351 /* 4-byte device entries */
1353 case ACPI_IVRS_TYPE_PAD4:
1354 case ACPI_IVRS_TYPE_ALL:
1355 case ACPI_IVRS_TYPE_SELECT:
1356 case ACPI_IVRS_TYPE_START:
1357 case ACPI_IVRS_TYPE_END:
1359 InfoTable = AcpiDmTableInfoIvrs4;
1362 /* 8-byte entries, type A */
1364 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1365 case ACPI_IVRS_TYPE_ALIAS_START:
1367 InfoTable = AcpiDmTableInfoIvrs8a;
1370 /* 8-byte entries, type B */
1372 case ACPI_IVRS_TYPE_PAD8:
1373 case ACPI_IVRS_TYPE_EXT_SELECT:
1374 case ACPI_IVRS_TYPE_EXT_START:
1376 InfoTable = AcpiDmTableInfoIvrs8b;
1379 /* 8-byte entries, type C */
1381 case ACPI_IVRS_TYPE_SPECIAL:
1383 InfoTable = AcpiDmTableInfoIvrs8c;
1387 InfoTable = AcpiDmTableInfoIvrs4;
1389 "\n**** Unknown IVRS device entry type/length: "
1390 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1391 EntryType, EntryLength, EntryOffset);
1395 /* Dump the Device Entry */
1397 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1398 DeviceEntry, EntryLength, InfoTable);
1400 EntryOffset += EntryLength;
1401 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1407 /* Point to next sub-table */
1409 Offset += SubTable->Length;
1410 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1415 /*******************************************************************************
1417 * FUNCTION: AcpiDmDumpMadt
1419 * PARAMETERS: Table - A MADT table
1423 * DESCRIPTION: Format the contents of a MADT. This table type consists
1424 * of an open-ended number of subtables.
1426 ******************************************************************************/
1430 ACPI_TABLE_HEADER *Table)
1433 ACPI_SUBTABLE_HEADER *SubTable;
1434 UINT32 Length = Table->Length;
1435 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
1436 ACPI_DMTABLE_INFO *InfoTable;
1441 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1442 if (ACPI_FAILURE (Status))
1449 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1450 while (Offset < Table->Length)
1452 /* Common sub-table header */
1454 AcpiOsPrintf ("\n");
1455 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1456 SubTable->Length, AcpiDmTableInfoMadtHdr);
1457 if (ACPI_FAILURE (Status))
1462 switch (SubTable->Type)
1464 case ACPI_MADT_TYPE_LOCAL_APIC:
1465 InfoTable = AcpiDmTableInfoMadt0;
1467 case ACPI_MADT_TYPE_IO_APIC:
1468 InfoTable = AcpiDmTableInfoMadt1;
1470 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1471 InfoTable = AcpiDmTableInfoMadt2;
1473 case ACPI_MADT_TYPE_NMI_SOURCE:
1474 InfoTable = AcpiDmTableInfoMadt3;
1476 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1477 InfoTable = AcpiDmTableInfoMadt4;
1479 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1480 InfoTable = AcpiDmTableInfoMadt5;
1482 case ACPI_MADT_TYPE_IO_SAPIC:
1483 InfoTable = AcpiDmTableInfoMadt6;
1485 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1486 InfoTable = AcpiDmTableInfoMadt7;
1488 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1489 InfoTable = AcpiDmTableInfoMadt8;
1491 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1492 InfoTable = AcpiDmTableInfoMadt9;
1494 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1495 InfoTable = AcpiDmTableInfoMadt10;
1497 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1498 InfoTable = AcpiDmTableInfoMadt11;
1500 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1501 InfoTable = AcpiDmTableInfoMadt12;
1504 AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type);
1506 /* Attempt to continue */
1508 if (!SubTable->Length)
1510 AcpiOsPrintf ("Invalid zero length subtable\n");
1516 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1517 SubTable->Length, InfoTable);
1518 if (ACPI_FAILURE (Status))
1524 /* Point to next sub-table */
1526 Offset += SubTable->Length;
1527 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1532 /*******************************************************************************
1534 * FUNCTION: AcpiDmDumpMcfg
1536 * PARAMETERS: Table - A MCFG Table
1540 * DESCRIPTION: Format the contents of a MCFG table
1542 ******************************************************************************/
1546 ACPI_TABLE_HEADER *Table)
1549 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
1550 ACPI_MCFG_ALLOCATION *SubTable;
1555 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1556 if (ACPI_FAILURE (Status))
1563 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1564 while (Offset < Table->Length)
1566 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1568 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1569 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1573 AcpiOsPrintf ("\n");
1574 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1575 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1576 if (ACPI_FAILURE (Status))
1581 /* Point to next sub-table (each subtable is of fixed length) */
1583 Offset += sizeof (ACPI_MCFG_ALLOCATION);
1584 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1585 sizeof (ACPI_MCFG_ALLOCATION));
1590 /*******************************************************************************
1592 * FUNCTION: AcpiDmDumpMpst
1594 * PARAMETERS: Table - A MPST Table
1598 * DESCRIPTION: Format the contents of a MPST table
1600 ******************************************************************************/
1604 ACPI_TABLE_HEADER *Table)
1607 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
1608 ACPI_MPST_POWER_NODE *SubTable0;
1609 ACPI_MPST_POWER_STATE *SubTable0A;
1610 ACPI_MPST_COMPONENT *SubTable0B;
1611 ACPI_MPST_DATA_HDR *SubTable1;
1612 ACPI_MPST_POWER_DATA *SubTable2;
1613 UINT16 SubtableCount;
1614 UINT8 PowerStateCount;
1615 UINT8 ComponentCount;
1620 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
1621 if (ACPI_FAILURE (Status))
1626 /* Subtable: Memory Power Node(s) */
1628 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
1629 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
1631 while ((Offset < Table->Length) && SubtableCount)
1633 AcpiOsPrintf ("\n");
1634 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
1635 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
1636 if (ACPI_FAILURE (Status))
1641 /* Extract the sub-subtable counts */
1643 PowerStateCount = SubTable0->NumPowerStates;
1644 ComponentCount = SubTable0->NumPhysicalComponents;
1645 Offset += sizeof (ACPI_MPST_POWER_NODE);
1647 /* Sub-subtables - Memory Power State Structure(s) */
1649 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
1650 sizeof (ACPI_MPST_POWER_NODE));
1652 while (PowerStateCount)
1654 AcpiOsPrintf ("\n");
1655 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
1656 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
1657 if (ACPI_FAILURE (Status))
1664 Offset += sizeof (ACPI_MPST_POWER_STATE);
1667 /* Sub-subtables - Physical Component ID Structure(s) */
1669 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
1673 AcpiOsPrintf ("\n");
1676 while (ComponentCount)
1678 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
1679 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
1680 if (ACPI_FAILURE (Status))
1687 Offset += sizeof (ACPI_MPST_COMPONENT);
1690 /* Point to next Memory Power Node subtable */
1693 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
1694 sizeof (ACPI_MPST_POWER_NODE) +
1695 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
1696 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
1699 /* Subtable: Count of Memory Power State Characteristic structures */
1701 AcpiOsPrintf ("\n");
1702 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
1703 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
1704 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
1705 if (ACPI_FAILURE (Status))
1710 SubtableCount = SubTable1->CharacteristicsCount;
1711 Offset += sizeof (ACPI_MPST_DATA_HDR);
1713 /* Subtable: Memory Power State Characteristics structure(s) */
1715 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
1717 while ((Offset < Table->Length) && SubtableCount)
1719 AcpiOsPrintf ("\n");
1720 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
1721 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
1722 if (ACPI_FAILURE (Status))
1729 Offset += sizeof (ACPI_MPST_POWER_DATA);
1734 /*******************************************************************************
1736 * FUNCTION: AcpiDmDumpMsct
1738 * PARAMETERS: Table - A MSCT table
1742 * DESCRIPTION: Format the contents of a MSCT
1744 ******************************************************************************/
1748 ACPI_TABLE_HEADER *Table)
1751 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
1752 ACPI_MSCT_PROXIMITY *SubTable;
1757 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1758 if (ACPI_FAILURE (Status))
1765 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1766 while (Offset < Table->Length)
1768 /* Common sub-table header */
1770 AcpiOsPrintf ("\n");
1771 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1772 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1773 if (ACPI_FAILURE (Status))
1778 /* Point to next sub-table */
1780 Offset += sizeof (ACPI_MSCT_PROXIMITY);
1781 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
1786 /*******************************************************************************
1788 * FUNCTION: AcpiDmDumpPcct
1790 * PARAMETERS: Table - A PCCT table
1794 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1795 * of an open-ended number of subtables.
1797 ******************************************************************************/
1801 ACPI_TABLE_HEADER *Table)
1804 ACPI_PCCT_SUBSPACE *SubTable;
1805 UINT32 Length = Table->Length;
1806 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
1811 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
1812 if (ACPI_FAILURE (Status))
1819 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
1820 while (Offset < Table->Length)
1822 AcpiOsPrintf ("\n");
1823 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1824 SubTable->Header.Length, AcpiDmTableInfoPcct0);
1825 if (ACPI_FAILURE (Status))
1830 /* Point to next sub-table */
1832 Offset += SubTable->Header.Length;
1833 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
1834 SubTable->Header.Length);
1839 /*******************************************************************************
1841 * FUNCTION: AcpiDmDumpPmtt
1843 * PARAMETERS: Table - A PMTT table
1847 * DESCRIPTION: Format the contents of a PMTT. This table type consists
1848 * of an open-ended number of subtables.
1850 ******************************************************************************/
1854 ACPI_TABLE_HEADER *Table)
1857 ACPI_PMTT_HEADER *SubTable;
1858 ACPI_PMTT_HEADER *MemSubTable;
1859 ACPI_PMTT_HEADER *DimmSubTable;
1860 ACPI_PMTT_DOMAIN *DomainArray;
1861 UINT32 Length = Table->Length;
1862 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
1865 UINT32 DomainOffset;
1871 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
1872 if (ACPI_FAILURE (Status))
1879 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
1880 while (Offset < Table->Length)
1882 /* Common subtable header */
1884 AcpiOsPrintf ("\n");
1885 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1886 SubTable->Length, AcpiDmTableInfoPmttHdr);
1887 if (ACPI_FAILURE (Status))
1892 /* Only Socket subtables are expected at this level */
1894 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
1897 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1902 /* Dump the fixed-length portion of the subtable */
1904 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1905 SubTable->Length, AcpiDmTableInfoPmtt0);
1906 if (ACPI_FAILURE (Status))
1911 /* Walk the memory controller subtables */
1913 MemOffset = sizeof (ACPI_PMTT_SOCKET);
1914 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
1915 sizeof (ACPI_PMTT_SOCKET));
1917 while (((Offset + MemOffset) < Table->Length) &&
1918 (MemOffset < SubTable->Length))
1920 /* Common subtable header */
1922 AcpiOsPrintf ("\n");
1923 Status = AcpiDmDumpTable (Length,
1924 Offset + MemOffset, MemSubTable,
1925 MemSubTable->Length, AcpiDmTableInfoPmttHdr);
1926 if (ACPI_FAILURE (Status))
1931 /* Only memory controller subtables are expected at this level */
1933 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
1936 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
1941 /* Dump the fixed-length portion of the controller subtable */
1943 Status = AcpiDmDumpTable (Length,
1944 Offset + MemOffset, MemSubTable,
1945 MemSubTable->Length, AcpiDmTableInfoPmtt1);
1946 if (ACPI_FAILURE (Status))
1951 /* Walk the variable count of proximity domains */
1953 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
1954 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
1955 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
1956 sizeof (ACPI_PMTT_CONTROLLER));
1958 while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
1959 ((MemOffset + DomainOffset) < SubTable->Length) &&
1962 Status = AcpiDmDumpTable (Length,
1963 Offset + MemOffset + DomainOffset, DomainArray,
1964 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
1965 if (ACPI_FAILURE (Status))
1970 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
1978 "\n**** DomainCount exceeds subtable length\n\n",
1982 /* Walk the physical component (DIMM) subtables */
1984 DimmOffset = DomainOffset;
1985 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
1988 while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
1989 (DimmOffset < MemSubTable->Length))
1991 /* Common subtable header */
1993 AcpiOsPrintf ("\n");
1994 Status = AcpiDmDumpTable (Length,
1995 Offset + MemOffset + DimmOffset, DimmSubTable,
1996 DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
1997 if (ACPI_FAILURE (Status))
2002 /* Only DIMM subtables are expected at this level */
2004 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
2007 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2008 DimmSubTable->Type);
2012 /* Dump the fixed-length DIMM subtable */
2014 Status = AcpiDmDumpTable (Length,
2015 Offset + MemOffset + DimmOffset, DimmSubTable,
2016 DimmSubTable->Length, AcpiDmTableInfoPmtt2);
2017 if (ACPI_FAILURE (Status))
2022 /* Point to next DIMM subtable */
2024 DimmOffset += DimmSubTable->Length;
2025 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2026 DimmSubTable, DimmSubTable->Length);
2029 /* Point to next Controller subtable */
2031 MemOffset += MemSubTable->Length;
2032 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2033 MemSubTable, MemSubTable->Length);
2036 /* Point to next Socket subtable */
2038 Offset += SubTable->Length;
2039 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
2040 SubTable, SubTable->Length);
2045 /*******************************************************************************
2047 * FUNCTION: AcpiDmDumpS3pt
2049 * PARAMETERS: Table - A S3PT table
2051 * RETURN: Length of the table
2053 * DESCRIPTION: Format the contents of a S3PT
2055 ******************************************************************************/
2059 ACPI_TABLE_HEADER *Tables)
2062 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
2063 ACPI_S3PT_HEADER *SubTable;
2064 ACPI_DMTABLE_INFO *InfoTable;
2065 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
2070 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
2071 if (ACPI_FAILURE (Status))
2076 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
2077 while (Offset < S3ptTable->Length)
2079 /* Common sub-table header */
2081 AcpiOsPrintf ("\n");
2082 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2083 SubTable->Length, AcpiDmTableInfoS3ptHdr);
2084 if (ACPI_FAILURE (Status))
2089 switch (SubTable->Type)
2091 case ACPI_S3PT_TYPE_RESUME:
2092 InfoTable = AcpiDmTableInfoS3pt0;
2094 case ACPI_S3PT_TYPE_SUSPEND:
2095 InfoTable = AcpiDmTableInfoS3pt1;
2098 AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type);
2100 /* Attempt to continue */
2102 if (!SubTable->Length)
2104 AcpiOsPrintf ("Invalid zero length subtable\n");
2110 AcpiOsPrintf ("\n");
2111 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
2112 SubTable->Length, InfoTable);
2113 if (ACPI_FAILURE (Status))
2119 /* Point to next sub-table */
2121 Offset += SubTable->Length;
2122 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
2125 return (S3ptTable->Length);
2129 /*******************************************************************************
2131 * FUNCTION: AcpiDmDumpSlic
2133 * PARAMETERS: Table - A SLIC table
2137 * DESCRIPTION: Format the contents of a SLIC
2139 ******************************************************************************/
2143 ACPI_TABLE_HEADER *Table)
2146 UINT32 Offset = sizeof (ACPI_TABLE_SLIC);
2147 ACPI_SLIC_HEADER *SubTable;
2148 ACPI_DMTABLE_INFO *InfoTable;
2151 /* There is no main SLIC table, only subtables */
2153 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
2154 while (Offset < Table->Length)
2156 /* Common sub-table header */
2158 AcpiOsPrintf ("\n");
2159 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2160 SubTable->Length, AcpiDmTableInfoSlicHdr);
2161 if (ACPI_FAILURE (Status))
2166 switch (SubTable->Type)
2168 case ACPI_SLIC_TYPE_PUBLIC_KEY:
2169 InfoTable = AcpiDmTableInfoSlic0;
2171 case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2172 InfoTable = AcpiDmTableInfoSlic1;
2175 AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type);
2177 /* Attempt to continue */
2179 if (!SubTable->Length)
2181 AcpiOsPrintf ("Invalid zero length subtable\n");
2187 AcpiOsPrintf ("\n");
2188 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2189 SubTable->Length, InfoTable);
2190 if (ACPI_FAILURE (Status))
2196 /* Point to next sub-table */
2198 Offset += SubTable->Length;
2199 SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
2204 /*******************************************************************************
2206 * FUNCTION: AcpiDmDumpSlit
2208 * PARAMETERS: Table - An SLIT
2212 * DESCRIPTION: Format the contents of a SLIT
2214 ******************************************************************************/
2218 ACPI_TABLE_HEADER *Table)
2230 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
2231 if (ACPI_FAILURE (Status))
2236 /* Display the Locality NxN Matrix */
2238 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
2239 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
2240 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
2242 for (i = 0; i < Localities; i++)
2244 /* Display one row of the matrix */
2246 AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
2247 for (j = 0; j < Localities; j++)
2249 /* Check for beyond EOT */
2251 if (Offset >= Table->Length)
2253 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2257 AcpiOsPrintf ("%2.2X", Row[j]);
2260 /* Display up to 16 bytes per output row */
2262 if ((j+1) < Localities)
2266 if (j && (((j+1) % 16) == 0))
2268 AcpiOsPrintf ("\\\n"); /* With line continuation char */
2269 AcpiDmLineHeader (Offset, 0, NULL);
2274 /* Point to next row */
2276 AcpiOsPrintf ("\n");
2282 /*******************************************************************************
2284 * FUNCTION: AcpiDmDumpSrat
2286 * PARAMETERS: Table - A SRAT table
2290 * DESCRIPTION: Format the contents of a SRAT
2292 ******************************************************************************/
2296 ACPI_TABLE_HEADER *Table)
2299 UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
2300 ACPI_SUBTABLE_HEADER *SubTable;
2301 ACPI_DMTABLE_INFO *InfoTable;
2306 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
2307 if (ACPI_FAILURE (Status))
2314 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2315 while (Offset < Table->Length)
2317 /* Common sub-table header */
2319 AcpiOsPrintf ("\n");
2320 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2321 SubTable->Length, AcpiDmTableInfoSratHdr);
2322 if (ACPI_FAILURE (Status))
2327 switch (SubTable->Type)
2329 case ACPI_SRAT_TYPE_CPU_AFFINITY:
2330 InfoTable = AcpiDmTableInfoSrat0;
2332 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2333 InfoTable = AcpiDmTableInfoSrat1;
2335 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2336 InfoTable = AcpiDmTableInfoSrat2;
2339 AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type);
2341 /* Attempt to continue */
2343 if (!SubTable->Length)
2345 AcpiOsPrintf ("Invalid zero length subtable\n");
2351 AcpiOsPrintf ("\n");
2352 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2353 SubTable->Length, InfoTable);
2354 if (ACPI_FAILURE (Status))
2360 /* Point to next sub-table */
2362 Offset += SubTable->Length;
2363 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2368 /*******************************************************************************
2370 * FUNCTION: AcpiDmDumpWdat
2372 * PARAMETERS: Table - A WDAT table
2376 * DESCRIPTION: Format the contents of a WDAT
2378 ******************************************************************************/
2382 ACPI_TABLE_HEADER *Table)
2385 UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
2386 ACPI_WDAT_ENTRY *SubTable;
2391 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
2392 if (ACPI_FAILURE (Status))
2399 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
2400 while (Offset < Table->Length)
2402 /* Common sub-table header */
2404 AcpiOsPrintf ("\n");
2405 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2406 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
2407 if (ACPI_FAILURE (Status))
2412 /* Point to next sub-table */
2414 Offset += sizeof (ACPI_WDAT_ENTRY);
2415 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));