1 /******************************************************************************
3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2013, 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
;
353 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
358 ExpectedLength
= ACPI_FADT_V1_SIZE
;
363 ExpectedLength
= ACPI_FADT_V2_SIZE
;
369 ExpectedLength
= ACPI_FADT_V3_SIZE
;
374 ExpectedLength
= ACPI_FADT_V5_SIZE
;
382 if (Length
== ExpectedLength
)
388 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
389 Revision
, Length
, ExpectedLength
);
393 /*******************************************************************************
395 * FUNCTION: AcpiDmDumpAsf
397 * PARAMETERS: Table - A ASF table
401 * DESCRIPTION: Format the contents of a ASF table
403 ******************************************************************************/
407 ACPI_TABLE_HEADER
*Table
)
410 UINT32 Offset
= sizeof (ACPI_TABLE_HEADER
);
411 ACPI_ASF_INFO
*SubTable
;
412 ACPI_DMTABLE_INFO
*InfoTable
;
413 ACPI_DMTABLE_INFO
*DataInfoTable
= NULL
;
414 UINT8
*DataTable
= NULL
;
415 UINT32 DataCount
= 0;
416 UINT32 DataLength
= 0;
417 UINT32 DataOffset
= 0;
422 /* No main table, only sub-tables */
424 SubTable
= ACPI_ADD_PTR (ACPI_ASF_INFO
, Table
, Offset
);
425 while (Offset
< Table
->Length
)
427 /* Common sub-table header */
429 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
430 SubTable
->Header
.Length
, AcpiDmTableInfoAsfHdr
);
431 if (ACPI_FAILURE (Status
))
436 /* The actual type is the lower 7 bits of Type */
438 Type
= (UINT8
) (SubTable
->Header
.Type
& 0x7F);
442 case ACPI_ASF_TYPE_INFO
:
444 InfoTable
= AcpiDmTableInfoAsf0
;
447 case ACPI_ASF_TYPE_ALERT
:
449 InfoTable
= AcpiDmTableInfoAsf1
;
450 DataInfoTable
= AcpiDmTableInfoAsf1a
;
451 DataTable
= ACPI_ADD_PTR (UINT8
, SubTable
, sizeof (ACPI_ASF_ALERT
));
452 DataCount
= ACPI_CAST_PTR (ACPI_ASF_ALERT
, SubTable
)->Alerts
;
453 DataLength
= ACPI_CAST_PTR (ACPI_ASF_ALERT
, SubTable
)->DataLength
;
454 DataOffset
= Offset
+ sizeof (ACPI_ASF_ALERT
);
457 case ACPI_ASF_TYPE_CONTROL
:
459 InfoTable
= AcpiDmTableInfoAsf2
;
460 DataInfoTable
= AcpiDmTableInfoAsf2a
;
461 DataTable
= ACPI_ADD_PTR (UINT8
, SubTable
, sizeof (ACPI_ASF_REMOTE
));
462 DataCount
= ACPI_CAST_PTR (ACPI_ASF_REMOTE
, SubTable
)->Controls
;
463 DataLength
= ACPI_CAST_PTR (ACPI_ASF_REMOTE
, SubTable
)->DataLength
;
464 DataOffset
= Offset
+ sizeof (ACPI_ASF_REMOTE
);
467 case ACPI_ASF_TYPE_BOOT
:
469 InfoTable
= AcpiDmTableInfoAsf3
;
472 case ACPI_ASF_TYPE_ADDRESS
:
474 InfoTable
= AcpiDmTableInfoAsf4
;
475 DataTable
= ACPI_ADD_PTR (UINT8
, SubTable
, sizeof (ACPI_ASF_ADDRESS
));
476 DataLength
= ACPI_CAST_PTR (ACPI_ASF_ADDRESS
, SubTable
)->Devices
;
477 DataOffset
= Offset
+ sizeof (ACPI_ASF_ADDRESS
);
482 AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable
->Header
.Type
);
486 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
487 SubTable
->Header
.Length
, InfoTable
);
488 if (ACPI_FAILURE (Status
))
493 /* Dump variable-length extra data */
497 case ACPI_ASF_TYPE_ALERT
:
498 case ACPI_ASF_TYPE_CONTROL
:
500 for (i
= 0; i
< DataCount
; i
++)
503 Status
= AcpiDmDumpTable (Table
->Length
, DataOffset
,
504 DataTable
, DataLength
, DataInfoTable
);
505 if (ACPI_FAILURE (Status
))
510 DataTable
= ACPI_ADD_PTR (UINT8
, DataTable
, DataLength
);
511 DataOffset
+= DataLength
;
515 case ACPI_ASF_TYPE_ADDRESS
:
517 for (i
= 0; i
< DataLength
; i
++)
521 AcpiDmLineHeader (DataOffset
, 1, "Addresses");
524 AcpiOsPrintf ("%2.2X ", *DataTable
);
527 if (DataOffset
> Table
->Length
)
529 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
544 /* Point to next sub-table */
546 if (!SubTable
->Header
.Length
)
548 AcpiOsPrintf ("Invalid zero subtable header length\n");
552 Offset
+= SubTable
->Header
.Length
;
553 SubTable
= ACPI_ADD_PTR (ACPI_ASF_INFO
, SubTable
, SubTable
->Header
.Length
);
558 /*******************************************************************************
560 * FUNCTION: AcpiDmDumpCpep
562 * PARAMETERS: Table - A CPEP table
566 * DESCRIPTION: Format the contents of a CPEP. This table type consists
567 * of an open-ended number of subtables.
569 ******************************************************************************/
573 ACPI_TABLE_HEADER
*Table
)
576 ACPI_CPEP_POLLING
*SubTable
;
577 UINT32 Length
= Table
->Length
;
578 UINT32 Offset
= sizeof (ACPI_TABLE_CPEP
);
583 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoCpep
);
584 if (ACPI_FAILURE (Status
))
591 SubTable
= ACPI_ADD_PTR (ACPI_CPEP_POLLING
, Table
, Offset
);
592 while (Offset
< Table
->Length
)
595 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
596 SubTable
->Header
.Length
, AcpiDmTableInfoCpep0
);
597 if (ACPI_FAILURE (Status
))
602 /* Point to next sub-table */
604 Offset
+= SubTable
->Header
.Length
;
605 SubTable
= ACPI_ADD_PTR (ACPI_CPEP_POLLING
, SubTable
,
606 SubTable
->Header
.Length
);
611 /*******************************************************************************
613 * FUNCTION: AcpiDmDumpCsrt
615 * PARAMETERS: Table - A CSRT table
619 * DESCRIPTION: Format the contents of a CSRT. This table type consists
620 * of an open-ended number of subtables.
622 ******************************************************************************/
626 ACPI_TABLE_HEADER
*Table
)
629 ACPI_CSRT_GROUP
*SubTable
;
630 ACPI_CSRT_SHARED_INFO
*SharedInfoTable
;
631 ACPI_CSRT_DESCRIPTOR
*SubSubTable
;
632 UINT32 Length
= Table
->Length
;
633 UINT32 Offset
= sizeof (ACPI_TABLE_CSRT
);
639 /* The main table only contains the ACPI header, thus already handled */
641 /* Sub-tables (Resource Groups) */
643 SubTable
= ACPI_ADD_PTR (ACPI_CSRT_GROUP
, Table
, Offset
);
644 while (Offset
< Table
->Length
)
646 /* Resource group subtable */
649 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
650 SubTable
->Length
, AcpiDmTableInfoCsrt0
);
651 if (ACPI_FAILURE (Status
))
656 /* Shared info subtable (One per resource group) */
658 SubOffset
= sizeof (ACPI_CSRT_GROUP
);
659 SharedInfoTable
= ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO
, Table
,
663 Status
= AcpiDmDumpTable (Length
, Offset
+ SubOffset
, SharedInfoTable
,
664 sizeof (ACPI_CSRT_SHARED_INFO
), AcpiDmTableInfoCsrt1
);
665 if (ACPI_FAILURE (Status
))
670 SubOffset
+= SubTable
->SharedInfoLength
;
672 /* Sub-Subtables (Resource Descriptors) */
674 SubSubTable
= ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR
, Table
,
677 while ((SubOffset
< SubTable
->Length
) &&
678 ((Offset
+ SubOffset
) < Table
->Length
))
681 Status
= AcpiDmDumpTable (Length
, Offset
+ SubOffset
, SubSubTable
,
682 SubSubTable
->Length
, AcpiDmTableInfoCsrt2
);
683 if (ACPI_FAILURE (Status
))
688 SubSubOffset
= sizeof (ACPI_CSRT_DESCRIPTOR
);
690 /* Resource-specific info buffer */
692 InfoLength
= SubSubTable
->Length
- SubSubOffset
;
694 AcpiDmDumpBuffer (SubSubTable
, SubSubOffset
, InfoLength
,
695 Offset
+ SubOffset
+ SubSubOffset
, "ResourceInfo");
696 SubSubOffset
+= InfoLength
;
698 /* Point to next sub-subtable */
700 SubOffset
+= SubSubTable
->Length
;
701 SubSubTable
= ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR
, SubSubTable
,
702 SubSubTable
->Length
);
705 /* Point to next sub-table */
707 Offset
+= SubTable
->Length
;
708 SubTable
= ACPI_ADD_PTR (ACPI_CSRT_GROUP
, SubTable
,
714 /*******************************************************************************
716 * FUNCTION: AcpiDmDumpDbg2
718 * PARAMETERS: Table - A DBG2 table
722 * DESCRIPTION: Format the contents of a DBG2. This table type consists
723 * of an open-ended number of subtables.
725 ******************************************************************************/
729 ACPI_TABLE_HEADER
*Table
)
732 ACPI_DBG2_DEVICE
*SubTable
;
733 UINT32 Length
= Table
->Length
;
734 UINT32 Offset
= sizeof (ACPI_TABLE_DBG2
);
737 UINT32 AbsoluteOffset
;
743 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoDbg2
);
744 if (ACPI_FAILURE (Status
))
751 SubTable
= ACPI_ADD_PTR (ACPI_DBG2_DEVICE
, Table
, Offset
);
752 while (Offset
< Table
->Length
)
755 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
756 SubTable
->Length
, AcpiDmTableInfoDbg2Device
);
757 if (ACPI_FAILURE (Status
))
762 /* Dump the BaseAddress array */
764 for (i
= 0; i
< SubTable
->RegisterCount
; i
++)
766 ArrayOffset
= SubTable
->BaseAddressOffset
+
767 (sizeof (ACPI_GENERIC_ADDRESS
) * i
);
768 AbsoluteOffset
= Offset
+ ArrayOffset
;
769 Array
= (UINT8
*) SubTable
+ ArrayOffset
;
771 Status
= AcpiDmDumpTable (Length
, AbsoluteOffset
, Array
,
772 SubTable
->Length
, AcpiDmTableInfoDbg2Addr
);
773 if (ACPI_FAILURE (Status
))
779 /* Dump the AddressSize array */
781 for (i
= 0; i
< SubTable
->RegisterCount
; i
++)
783 ArrayOffset
= SubTable
->AddressSizeOffset
+
784 (sizeof (UINT32
) * i
);
785 AbsoluteOffset
= Offset
+ ArrayOffset
;
786 Array
= (UINT8
*) SubTable
+ ArrayOffset
;
788 Status
= AcpiDmDumpTable (Length
, AbsoluteOffset
, Array
,
789 SubTable
->Length
, AcpiDmTableInfoDbg2Size
);
790 if (ACPI_FAILURE (Status
))
796 /* Dump the Namestring (required) */
799 ArrayOffset
= SubTable
->NamepathOffset
;
800 AbsoluteOffset
= Offset
+ ArrayOffset
;
801 Array
= (UINT8
*) SubTable
+ ArrayOffset
;
803 Status
= AcpiDmDumpTable (Length
, AbsoluteOffset
, Array
,
804 SubTable
->Length
, AcpiDmTableInfoDbg2Name
);
805 if (ACPI_FAILURE (Status
))
810 /* Dump the OemData (optional) */
812 AcpiDmDumpBuffer (SubTable
, SubTable
->OemDataOffset
, SubTable
->OemDataLength
,
813 Offset
+ SubTable
->OemDataOffset
, "OEM Data");
815 /* Point to next sub-table */
817 Offset
+= SubTable
->Length
;
818 SubTable
= ACPI_ADD_PTR (ACPI_DBG2_DEVICE
, SubTable
,
824 /*******************************************************************************
826 * FUNCTION: AcpiDmDumpDmar
828 * PARAMETERS: Table - A DMAR table
832 * DESCRIPTION: Format the contents of a DMAR. This table type consists
833 * of an open-ended number of subtables.
835 ******************************************************************************/
840 ACPI_TABLE_HEADER
*Table
)
843 ACPI_DMAR_HEADER
*SubTable
;
844 UINT32 Length
= Table
->Length
;
845 UINT32 Offset
= sizeof (ACPI_TABLE_DMAR
);
846 ACPI_DMTABLE_INFO
*InfoTable
;
847 ACPI_DMAR_DEVICE_SCOPE
*ScopeTable
;
855 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoDmar
);
856 if (ACPI_FAILURE (Status
))
863 SubTable
= ACPI_ADD_PTR (ACPI_DMAR_HEADER
, Table
, Offset
);
864 while (Offset
< Table
->Length
)
866 /* Common sub-table header */
869 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
870 SubTable
->Length
, AcpiDmTableInfoDmarHdr
);
871 if (ACPI_FAILURE (Status
))
877 switch (SubTable
->Type
)
879 case ACPI_DMAR_TYPE_HARDWARE_UNIT
:
881 InfoTable
= AcpiDmTableInfoDmar0
;
882 ScopeOffset
= sizeof (ACPI_DMAR_HARDWARE_UNIT
);
885 case ACPI_DMAR_TYPE_RESERVED_MEMORY
:
887 InfoTable
= AcpiDmTableInfoDmar1
;
888 ScopeOffset
= sizeof (ACPI_DMAR_RESERVED_MEMORY
);
891 case ACPI_DMAR_TYPE_ATSR
:
893 InfoTable
= AcpiDmTableInfoDmar2
;
894 ScopeOffset
= sizeof (ACPI_DMAR_ATSR
);
897 case ACPI_DMAR_HARDWARE_AFFINITY
:
899 InfoTable
= AcpiDmTableInfoDmar3
;
900 ScopeOffset
= sizeof (ACPI_DMAR_RHSA
);
905 AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable
->Type
);
909 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
910 SubTable
->Length
, InfoTable
);
911 if (ACPI_FAILURE (Status
))
916 /* Dump the device scope entries (if any) */
918 ScopeTable
= ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE
, SubTable
, ScopeOffset
);
919 while (ScopeOffset
< SubTable
->Length
)
922 Status
= AcpiDmDumpTable (Length
, Offset
+ ScopeOffset
, ScopeTable
,
923 ScopeTable
->Length
, AcpiDmTableInfoDmarScope
);
924 if (ACPI_FAILURE (Status
))
930 /* Dump the PCI Path entries for this device scope */
932 PathOffset
= sizeof (ACPI_DMAR_DEVICE_SCOPE
); /* Path entries start at this offset */
934 PciPath
= ACPI_ADD_PTR (UINT8
, ScopeTable
,
935 sizeof (ACPI_DMAR_DEVICE_SCOPE
));
937 while (PathOffset
< ScopeTable
->Length
)
939 AcpiDmLineHeader ((PathOffset
+ ScopeOffset
+ Offset
), 2, "PCI Path");
940 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath
[0], PciPath
[1]);
942 /* Point to next PCI Path entry */
949 /* Point to next device scope entry */
951 ScopeOffset
+= ScopeTable
->Length
;
952 ScopeTable
= ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE
,
953 ScopeTable
, ScopeTable
->Length
);
956 /* Point to next sub-table */
958 Offset
+= SubTable
->Length
;
959 SubTable
= ACPI_ADD_PTR (ACPI_DMAR_HEADER
, SubTable
, SubTable
->Length
);
964 /*******************************************************************************
966 * FUNCTION: AcpiDmDumpEinj
968 * PARAMETERS: Table - A EINJ table
972 * DESCRIPTION: Format the contents of a EINJ. This table type consists
973 * of an open-ended number of subtables.
975 ******************************************************************************/
979 ACPI_TABLE_HEADER
*Table
)
982 ACPI_WHEA_HEADER
*SubTable
;
983 UINT32 Length
= Table
->Length
;
984 UINT32 Offset
= sizeof (ACPI_TABLE_EINJ
);
989 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoEinj
);
990 if (ACPI_FAILURE (Status
))
997 SubTable
= ACPI_ADD_PTR (ACPI_WHEA_HEADER
, Table
, Offset
);
998 while (Offset
< Table
->Length
)
1000 AcpiOsPrintf ("\n");
1001 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1002 sizeof (ACPI_WHEA_HEADER
), AcpiDmTableInfoEinj0
);
1003 if (ACPI_FAILURE (Status
))
1008 /* Point to next sub-table (each subtable is of fixed length) */
1010 Offset
+= sizeof (ACPI_WHEA_HEADER
);
1011 SubTable
= ACPI_ADD_PTR (ACPI_WHEA_HEADER
, SubTable
,
1012 sizeof (ACPI_WHEA_HEADER
));
1017 /*******************************************************************************
1019 * FUNCTION: AcpiDmDumpErst
1021 * PARAMETERS: Table - A ERST table
1025 * DESCRIPTION: Format the contents of a ERST. This table type consists
1026 * of an open-ended number of subtables.
1028 ******************************************************************************/
1032 ACPI_TABLE_HEADER
*Table
)
1035 ACPI_WHEA_HEADER
*SubTable
;
1036 UINT32 Length
= Table
->Length
;
1037 UINT32 Offset
= sizeof (ACPI_TABLE_ERST
);
1042 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoErst
);
1043 if (ACPI_FAILURE (Status
))
1050 SubTable
= ACPI_ADD_PTR (ACPI_WHEA_HEADER
, Table
, Offset
);
1051 while (Offset
< Table
->Length
)
1053 AcpiOsPrintf ("\n");
1054 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1055 sizeof (ACPI_WHEA_HEADER
), AcpiDmTableInfoErst0
);
1056 if (ACPI_FAILURE (Status
))
1061 /* Point to next sub-table (each subtable is of fixed length) */
1063 Offset
+= sizeof (ACPI_WHEA_HEADER
);
1064 SubTable
= ACPI_ADD_PTR (ACPI_WHEA_HEADER
, SubTable
,
1065 sizeof (ACPI_WHEA_HEADER
));
1070 /*******************************************************************************
1072 * FUNCTION: AcpiDmDumpFpdt
1074 * PARAMETERS: Table - A FPDT table
1078 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1079 * of an open-ended number of subtables.
1081 ******************************************************************************/
1085 ACPI_TABLE_HEADER
*Table
)
1088 ACPI_FPDT_HEADER
*SubTable
;
1089 UINT32 Length
= Table
->Length
;
1090 UINT32 Offset
= sizeof (ACPI_TABLE_FPDT
);
1091 ACPI_DMTABLE_INFO
*InfoTable
;
1094 /* There is no main table (other than the standard ACPI header) */
1098 SubTable
= ACPI_ADD_PTR (ACPI_FPDT_HEADER
, Table
, Offset
);
1099 while (Offset
< Table
->Length
)
1101 /* Common sub-table header */
1103 AcpiOsPrintf ("\n");
1104 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1105 SubTable
->Length
, AcpiDmTableInfoFpdtHdr
);
1106 if (ACPI_FAILURE (Status
))
1111 switch (SubTable
->Type
)
1113 case ACPI_FPDT_TYPE_BOOT
:
1115 InfoTable
= AcpiDmTableInfoFpdt0
;
1118 case ACPI_FPDT_TYPE_S3PERF
:
1120 InfoTable
= AcpiDmTableInfoFpdt1
;
1125 AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable
->Type
);
1127 /* Attempt to continue */
1129 if (!SubTable
->Length
)
1131 AcpiOsPrintf ("Invalid zero length subtable\n");
1137 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1138 SubTable
->Length
, InfoTable
);
1139 if (ACPI_FAILURE (Status
))
1145 /* Point to next sub-table */
1147 Offset
+= SubTable
->Length
;
1148 SubTable
= ACPI_ADD_PTR (ACPI_FPDT_HEADER
, SubTable
, SubTable
->Length
);
1153 /*******************************************************************************
1155 * FUNCTION: AcpiDmDumpHest
1157 * PARAMETERS: Table - A HEST table
1161 * DESCRIPTION: Format the contents of a HEST. This table type consists
1162 * of an open-ended number of subtables.
1164 ******************************************************************************/
1168 ACPI_TABLE_HEADER
*Table
)
1171 ACPI_HEST_HEADER
*SubTable
;
1172 UINT32 Length
= Table
->Length
;
1173 UINT32 Offset
= sizeof (ACPI_TABLE_HEST
);
1174 ACPI_DMTABLE_INFO
*InfoTable
;
1175 UINT32 SubTableLength
;
1177 ACPI_HEST_IA_ERROR_BANK
*BankTable
;
1182 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoHest
);
1183 if (ACPI_FAILURE (Status
))
1190 SubTable
= ACPI_ADD_PTR (ACPI_HEST_HEADER
, Table
, Offset
);
1191 while (Offset
< Table
->Length
)
1194 switch (SubTable
->Type
)
1196 case ACPI_HEST_TYPE_IA32_CHECK
:
1198 InfoTable
= AcpiDmTableInfoHest0
;
1199 SubTableLength
= sizeof (ACPI_HEST_IA_MACHINE_CHECK
);
1200 BankCount
= (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK
,
1201 SubTable
))->NumHardwareBanks
;
1204 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK
:
1206 InfoTable
= AcpiDmTableInfoHest1
;
1207 SubTableLength
= sizeof (ACPI_HEST_IA_CORRECTED
);
1208 BankCount
= (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED
,
1209 SubTable
))->NumHardwareBanks
;
1212 case ACPI_HEST_TYPE_IA32_NMI
:
1214 InfoTable
= AcpiDmTableInfoHest2
;
1215 SubTableLength
= sizeof (ACPI_HEST_IA_NMI
);
1218 case ACPI_HEST_TYPE_AER_ROOT_PORT
:
1220 InfoTable
= AcpiDmTableInfoHest6
;
1221 SubTableLength
= sizeof (ACPI_HEST_AER_ROOT
);
1224 case ACPI_HEST_TYPE_AER_ENDPOINT
:
1226 InfoTable
= AcpiDmTableInfoHest7
;
1227 SubTableLength
= sizeof (ACPI_HEST_AER
);
1230 case ACPI_HEST_TYPE_AER_BRIDGE
:
1232 InfoTable
= AcpiDmTableInfoHest8
;
1233 SubTableLength
= sizeof (ACPI_HEST_AER_BRIDGE
);
1236 case ACPI_HEST_TYPE_GENERIC_ERROR
:
1238 InfoTable
= AcpiDmTableInfoHest9
;
1239 SubTableLength
= sizeof (ACPI_HEST_GENERIC
);
1244 /* Cannot continue on unknown type - no length */
1246 AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable
->Type
);
1250 AcpiOsPrintf ("\n");
1251 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1252 SubTableLength
, InfoTable
);
1253 if (ACPI_FAILURE (Status
))
1258 /* Point to end of current subtable (each subtable above is of fixed length) */
1260 Offset
+= SubTableLength
;
1262 /* If there are any (fixed-length) Error Banks from above, dump them now */
1266 BankTable
= ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK
, SubTable
, SubTableLength
);
1267 SubTableLength
+= BankCount
* sizeof (ACPI_HEST_IA_ERROR_BANK
);
1271 AcpiOsPrintf ("\n");
1272 Status
= AcpiDmDumpTable (Length
, Offset
, BankTable
,
1273 sizeof (ACPI_HEST_IA_ERROR_BANK
), AcpiDmTableInfoHestBank
);
1274 if (ACPI_FAILURE (Status
))
1278 Offset
+= sizeof (ACPI_HEST_IA_ERROR_BANK
);
1284 /* Point to next sub-table */
1286 SubTable
= ACPI_ADD_PTR (ACPI_HEST_HEADER
, SubTable
, SubTableLength
);
1291 /*******************************************************************************
1293 * FUNCTION: AcpiDmDumpIvrs
1295 * PARAMETERS: Table - A IVRS table
1299 * DESCRIPTION: Format the contents of a IVRS
1301 ******************************************************************************/
1303 static UINT8 EntrySizes
[] = {4,8,16,32};
1307 ACPI_TABLE_HEADER
*Table
)
1310 UINT32 Offset
= sizeof (ACPI_TABLE_IVRS
);
1314 ACPI_IVRS_DE_HEADER
*DeviceEntry
;
1315 ACPI_IVRS_HEADER
*SubTable
;
1316 ACPI_DMTABLE_INFO
*InfoTable
;
1321 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoIvrs
);
1322 if (ACPI_FAILURE (Status
))
1329 SubTable
= ACPI_ADD_PTR (ACPI_IVRS_HEADER
, Table
, Offset
);
1330 while (Offset
< Table
->Length
)
1332 /* Common sub-table header */
1334 AcpiOsPrintf ("\n");
1335 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
1336 SubTable
->Length
, AcpiDmTableInfoIvrsHdr
);
1337 if (ACPI_FAILURE (Status
))
1342 switch (SubTable
->Type
)
1344 case ACPI_IVRS_TYPE_HARDWARE
:
1346 InfoTable
= AcpiDmTableInfoIvrs0
;
1349 case ACPI_IVRS_TYPE_MEMORY1
:
1350 case ACPI_IVRS_TYPE_MEMORY2
:
1351 case ACPI_IVRS_TYPE_MEMORY3
:
1353 InfoTable
= AcpiDmTableInfoIvrs1
;
1358 AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
1361 /* Attempt to continue */
1363 if (!SubTable
->Length
)
1365 AcpiOsPrintf ("Invalid zero length subtable\n");
1371 /* Dump the subtable */
1373 AcpiOsPrintf ("\n");
1374 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
1375 SubTable
->Length
, InfoTable
);
1376 if (ACPI_FAILURE (Status
))
1381 /* The hardware subtable can contain multiple device entries */
1383 if (SubTable
->Type
== ACPI_IVRS_TYPE_HARDWARE
)
1385 EntryOffset
= Offset
+ sizeof (ACPI_IVRS_HARDWARE
);
1386 DeviceEntry
= ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER
, SubTable
,
1387 sizeof (ACPI_IVRS_HARDWARE
));
1389 while (EntryOffset
< (Offset
+ SubTable
->Length
))
1391 AcpiOsPrintf ("\n");
1393 * Upper 2 bits of Type encode the length of the device entry
1397 * 10 = 16 byte - currently no entries defined
1398 * 11 = 32 byte - currently no entries defined
1400 EntryType
= DeviceEntry
->Type
;
1401 EntryLength
= EntrySizes
[EntryType
>> 6];
1405 /* 4-byte device entries */
1407 case ACPI_IVRS_TYPE_PAD4
:
1408 case ACPI_IVRS_TYPE_ALL
:
1409 case ACPI_IVRS_TYPE_SELECT
:
1410 case ACPI_IVRS_TYPE_START
:
1411 case ACPI_IVRS_TYPE_END
:
1413 InfoTable
= AcpiDmTableInfoIvrs4
;
1416 /* 8-byte entries, type A */
1418 case ACPI_IVRS_TYPE_ALIAS_SELECT
:
1419 case ACPI_IVRS_TYPE_ALIAS_START
:
1421 InfoTable
= AcpiDmTableInfoIvrs8a
;
1424 /* 8-byte entries, type B */
1426 case ACPI_IVRS_TYPE_PAD8
:
1427 case ACPI_IVRS_TYPE_EXT_SELECT
:
1428 case ACPI_IVRS_TYPE_EXT_START
:
1430 InfoTable
= AcpiDmTableInfoIvrs8b
;
1433 /* 8-byte entries, type C */
1435 case ACPI_IVRS_TYPE_SPECIAL
:
1437 InfoTable
= AcpiDmTableInfoIvrs8c
;
1441 InfoTable
= AcpiDmTableInfoIvrs4
;
1443 "\n**** Unknown IVRS device entry type/length: "
1444 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1445 EntryType
, EntryLength
, EntryOffset
);
1449 /* Dump the Device Entry */
1451 Status
= AcpiDmDumpTable (Table
->Length
, EntryOffset
,
1452 DeviceEntry
, EntryLength
, InfoTable
);
1454 EntryOffset
+= EntryLength
;
1455 DeviceEntry
= ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER
, DeviceEntry
,
1461 /* Point to next sub-table */
1463 Offset
+= SubTable
->Length
;
1464 SubTable
= ACPI_ADD_PTR (ACPI_IVRS_HEADER
, SubTable
, SubTable
->Length
);
1469 /*******************************************************************************
1471 * FUNCTION: AcpiDmDumpMadt
1473 * PARAMETERS: Table - A MADT table
1477 * DESCRIPTION: Format the contents of a MADT. This table type consists
1478 * of an open-ended number of subtables.
1480 ******************************************************************************/
1484 ACPI_TABLE_HEADER
*Table
)
1487 ACPI_SUBTABLE_HEADER
*SubTable
;
1488 UINT32 Length
= Table
->Length
;
1489 UINT32 Offset
= sizeof (ACPI_TABLE_MADT
);
1490 ACPI_DMTABLE_INFO
*InfoTable
;
1495 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoMadt
);
1496 if (ACPI_FAILURE (Status
))
1503 SubTable
= ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER
, Table
, Offset
);
1504 while (Offset
< Table
->Length
)
1506 /* Common sub-table header */
1508 AcpiOsPrintf ("\n");
1509 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1510 SubTable
->Length
, AcpiDmTableInfoMadtHdr
);
1511 if (ACPI_FAILURE (Status
))
1516 switch (SubTable
->Type
)
1518 case ACPI_MADT_TYPE_LOCAL_APIC
:
1520 InfoTable
= AcpiDmTableInfoMadt0
;
1523 case ACPI_MADT_TYPE_IO_APIC
:
1525 InfoTable
= AcpiDmTableInfoMadt1
;
1528 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE
:
1530 InfoTable
= AcpiDmTableInfoMadt2
;
1533 case ACPI_MADT_TYPE_NMI_SOURCE
:
1535 InfoTable
= AcpiDmTableInfoMadt3
;
1538 case ACPI_MADT_TYPE_LOCAL_APIC_NMI
:
1540 InfoTable
= AcpiDmTableInfoMadt4
;
1543 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE
:
1545 InfoTable
= AcpiDmTableInfoMadt5
;
1548 case ACPI_MADT_TYPE_IO_SAPIC
:
1550 InfoTable
= AcpiDmTableInfoMadt6
;
1553 case ACPI_MADT_TYPE_LOCAL_SAPIC
:
1555 InfoTable
= AcpiDmTableInfoMadt7
;
1558 case ACPI_MADT_TYPE_INTERRUPT_SOURCE
:
1560 InfoTable
= AcpiDmTableInfoMadt8
;
1563 case ACPI_MADT_TYPE_LOCAL_X2APIC
:
1565 InfoTable
= AcpiDmTableInfoMadt9
;
1568 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI
:
1570 InfoTable
= AcpiDmTableInfoMadt10
;
1573 case ACPI_MADT_TYPE_GENERIC_INTERRUPT
:
1575 InfoTable
= AcpiDmTableInfoMadt11
;
1578 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR
:
1580 InfoTable
= AcpiDmTableInfoMadt12
;
1585 AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable
->Type
);
1587 /* Attempt to continue */
1589 if (!SubTable
->Length
)
1591 AcpiOsPrintf ("Invalid zero length subtable\n");
1597 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1598 SubTable
->Length
, InfoTable
);
1599 if (ACPI_FAILURE (Status
))
1605 /* Point to next sub-table */
1607 Offset
+= SubTable
->Length
;
1608 SubTable
= ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER
, SubTable
, SubTable
->Length
);
1613 /*******************************************************************************
1615 * FUNCTION: AcpiDmDumpMcfg
1617 * PARAMETERS: Table - A MCFG Table
1621 * DESCRIPTION: Format the contents of a MCFG table
1623 ******************************************************************************/
1627 ACPI_TABLE_HEADER
*Table
)
1630 UINT32 Offset
= sizeof (ACPI_TABLE_MCFG
);
1631 ACPI_MCFG_ALLOCATION
*SubTable
;
1636 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoMcfg
);
1637 if (ACPI_FAILURE (Status
))
1644 SubTable
= ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION
, Table
, Offset
);
1645 while (Offset
< Table
->Length
)
1647 if (Offset
+ sizeof (ACPI_MCFG_ALLOCATION
) > Table
->Length
)
1649 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
1650 sizeof (ACPI_MCFG_ALLOCATION
) - (Offset
- Table
->Length
));
1654 AcpiOsPrintf ("\n");
1655 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
1656 sizeof (ACPI_MCFG_ALLOCATION
), AcpiDmTableInfoMcfg0
);
1657 if (ACPI_FAILURE (Status
))
1662 /* Point to next sub-table (each subtable is of fixed length) */
1664 Offset
+= sizeof (ACPI_MCFG_ALLOCATION
);
1665 SubTable
= ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION
, SubTable
,
1666 sizeof (ACPI_MCFG_ALLOCATION
));
1671 /*******************************************************************************
1673 * FUNCTION: AcpiDmDumpMpst
1675 * PARAMETERS: Table - A MPST Table
1679 * DESCRIPTION: Format the contents of a MPST table
1681 ******************************************************************************/
1685 ACPI_TABLE_HEADER
*Table
)
1688 UINT32 Offset
= sizeof (ACPI_TABLE_MPST
);
1689 ACPI_MPST_POWER_NODE
*SubTable0
;
1690 ACPI_MPST_POWER_STATE
*SubTable0A
;
1691 ACPI_MPST_COMPONENT
*SubTable0B
;
1692 ACPI_MPST_DATA_HDR
*SubTable1
;
1693 ACPI_MPST_POWER_DATA
*SubTable2
;
1694 UINT16 SubtableCount
;
1695 UINT32 PowerStateCount
;
1696 UINT32 ComponentCount
;
1701 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoMpst
);
1702 if (ACPI_FAILURE (Status
))
1707 /* Subtable: Memory Power Node(s) */
1709 SubtableCount
= (ACPI_CAST_PTR (ACPI_TABLE_MPST
, Table
))->PowerNodeCount
;
1710 SubTable0
= ACPI_ADD_PTR (ACPI_MPST_POWER_NODE
, Table
, Offset
);
1712 while ((Offset
< Table
->Length
) && SubtableCount
)
1714 AcpiOsPrintf ("\n");
1715 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable0
,
1716 sizeof (ACPI_MPST_POWER_NODE
), AcpiDmTableInfoMpst0
);
1717 if (ACPI_FAILURE (Status
))
1722 /* Extract the sub-subtable counts */
1724 PowerStateCount
= SubTable0
->NumPowerStates
;
1725 ComponentCount
= SubTable0
->NumPhysicalComponents
;
1726 Offset
+= sizeof (ACPI_MPST_POWER_NODE
);
1728 /* Sub-subtables - Memory Power State Structure(s) */
1730 SubTable0A
= ACPI_ADD_PTR (ACPI_MPST_POWER_STATE
, SubTable0
,
1731 sizeof (ACPI_MPST_POWER_NODE
));
1733 while (PowerStateCount
)
1735 AcpiOsPrintf ("\n");
1736 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable0A
,
1737 sizeof (ACPI_MPST_POWER_STATE
), AcpiDmTableInfoMpst0A
);
1738 if (ACPI_FAILURE (Status
))
1745 Offset
+= sizeof (ACPI_MPST_POWER_STATE
);
1748 /* Sub-subtables - Physical Component ID Structure(s) */
1750 SubTable0B
= ACPI_CAST_PTR (ACPI_MPST_COMPONENT
, SubTable0A
);
1754 AcpiOsPrintf ("\n");
1757 while (ComponentCount
)
1759 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable0B
,
1760 sizeof (ACPI_MPST_COMPONENT
), AcpiDmTableInfoMpst0B
);
1761 if (ACPI_FAILURE (Status
))
1768 Offset
+= sizeof (ACPI_MPST_COMPONENT
);
1771 /* Point to next Memory Power Node subtable */
1774 SubTable0
= ACPI_ADD_PTR (ACPI_MPST_POWER_NODE
, SubTable0
,
1775 sizeof (ACPI_MPST_POWER_NODE
) +
1776 (sizeof (ACPI_MPST_POWER_STATE
) * SubTable0
->NumPowerStates
) +
1777 (sizeof (ACPI_MPST_COMPONENT
) * SubTable0
->NumPhysicalComponents
));
1780 /* Subtable: Count of Memory Power State Characteristic structures */
1782 AcpiOsPrintf ("\n");
1783 SubTable1
= ACPI_CAST_PTR (ACPI_MPST_DATA_HDR
, SubTable0
);
1784 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable1
,
1785 sizeof (ACPI_MPST_DATA_HDR
), AcpiDmTableInfoMpst1
);
1786 if (ACPI_FAILURE (Status
))
1791 SubtableCount
= SubTable1
->CharacteristicsCount
;
1792 Offset
+= sizeof (ACPI_MPST_DATA_HDR
);
1794 /* Subtable: Memory Power State Characteristics structure(s) */
1796 SubTable2
= ACPI_ADD_PTR (ACPI_MPST_POWER_DATA
, SubTable1
, sizeof (ACPI_MPST_DATA_HDR
));
1798 while ((Offset
< Table
->Length
) && SubtableCount
)
1800 AcpiOsPrintf ("\n");
1801 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable2
,
1802 sizeof (ACPI_MPST_POWER_DATA
), AcpiDmTableInfoMpst2
);
1803 if (ACPI_FAILURE (Status
))
1810 Offset
+= sizeof (ACPI_MPST_POWER_DATA
);
1815 /*******************************************************************************
1817 * FUNCTION: AcpiDmDumpMsct
1819 * PARAMETERS: Table - A MSCT table
1823 * DESCRIPTION: Format the contents of a MSCT
1825 ******************************************************************************/
1829 ACPI_TABLE_HEADER
*Table
)
1832 UINT32 Offset
= sizeof (ACPI_TABLE_MSCT
);
1833 ACPI_MSCT_PROXIMITY
*SubTable
;
1838 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoMsct
);
1839 if (ACPI_FAILURE (Status
))
1846 SubTable
= ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY
, Table
, Offset
);
1847 while (Offset
< Table
->Length
)
1849 /* Common sub-table header */
1851 AcpiOsPrintf ("\n");
1852 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
1853 sizeof (ACPI_MSCT_PROXIMITY
), AcpiDmTableInfoMsct0
);
1854 if (ACPI_FAILURE (Status
))
1859 /* Point to next sub-table */
1861 Offset
+= sizeof (ACPI_MSCT_PROXIMITY
);
1862 SubTable
= ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY
, SubTable
, sizeof (ACPI_MSCT_PROXIMITY
));
1867 /*******************************************************************************
1869 * FUNCTION: AcpiDmDumpMtmr
1871 * PARAMETERS: Table - A MTMR table
1875 * DESCRIPTION: Format the contents of a MTMR
1877 ******************************************************************************/
1881 ACPI_TABLE_HEADER
*Table
)
1884 UINT32 Offset
= sizeof (ACPI_TABLE_MTMR
);
1885 ACPI_MTMR_ENTRY
*SubTable
;
1890 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoMtmr
);
1891 if (ACPI_FAILURE (Status
))
1898 SubTable
= ACPI_ADD_PTR (ACPI_MTMR_ENTRY
, Table
, Offset
);
1899 while (Offset
< Table
->Length
)
1901 /* Common sub-table header */
1903 AcpiOsPrintf ("\n");
1904 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
1905 sizeof (ACPI_MTMR_ENTRY
), AcpiDmTableInfoMtmr0
);
1906 if (ACPI_FAILURE (Status
))
1911 /* Point to next sub-table */
1913 Offset
+= sizeof (ACPI_MTMR_ENTRY
);
1914 SubTable
= ACPI_ADD_PTR (ACPI_MTMR_ENTRY
, SubTable
, sizeof (ACPI_MTMR_ENTRY
));
1919 /*******************************************************************************
1921 * FUNCTION: AcpiDmDumpPcct
1923 * PARAMETERS: Table - A PCCT table
1927 * DESCRIPTION: Format the contents of a PCCT. This table type consists
1928 * of an open-ended number of subtables.
1930 ******************************************************************************/
1934 ACPI_TABLE_HEADER
*Table
)
1937 ACPI_PCCT_SUBSPACE
*SubTable
;
1938 UINT32 Length
= Table
->Length
;
1939 UINT32 Offset
= sizeof (ACPI_TABLE_PCCT
);
1944 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoPcct
);
1945 if (ACPI_FAILURE (Status
))
1952 SubTable
= ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE
, Table
, Offset
);
1953 while (Offset
< Table
->Length
)
1955 AcpiOsPrintf ("\n");
1956 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
1957 SubTable
->Header
.Length
, AcpiDmTableInfoPcct0
);
1958 if (ACPI_FAILURE (Status
))
1963 /* Point to next sub-table */
1965 Offset
+= SubTable
->Header
.Length
;
1966 SubTable
= ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE
, SubTable
,
1967 SubTable
->Header
.Length
);
1972 /*******************************************************************************
1974 * FUNCTION: AcpiDmDumpPmtt
1976 * PARAMETERS: Table - A PMTT table
1980 * DESCRIPTION: Format the contents of a PMTT. This table type consists
1981 * of an open-ended number of subtables.
1983 ******************************************************************************/
1987 ACPI_TABLE_HEADER
*Table
)
1990 ACPI_PMTT_HEADER
*SubTable
;
1991 ACPI_PMTT_HEADER
*MemSubTable
;
1992 ACPI_PMTT_HEADER
*DimmSubTable
;
1993 ACPI_PMTT_DOMAIN
*DomainArray
;
1994 UINT32 Length
= Table
->Length
;
1995 UINT32 Offset
= sizeof (ACPI_TABLE_PMTT
);
1998 UINT32 DomainOffset
;
2004 Status
= AcpiDmDumpTable (Length
, 0, Table
, 0, AcpiDmTableInfoPmtt
);
2005 if (ACPI_FAILURE (Status
))
2012 SubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
, Table
, Offset
);
2013 while (Offset
< Table
->Length
)
2015 /* Common subtable header */
2017 AcpiOsPrintf ("\n");
2018 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
2019 SubTable
->Length
, AcpiDmTableInfoPmttHdr
);
2020 if (ACPI_FAILURE (Status
))
2025 /* Only Socket subtables are expected at this level */
2027 if (SubTable
->Type
!= ACPI_PMTT_TYPE_SOCKET
)
2030 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2035 /* Dump the fixed-length portion of the subtable */
2037 Status
= AcpiDmDumpTable (Length
, Offset
, SubTable
,
2038 SubTable
->Length
, AcpiDmTableInfoPmtt0
);
2039 if (ACPI_FAILURE (Status
))
2044 /* Walk the memory controller subtables */
2046 MemOffset
= sizeof (ACPI_PMTT_SOCKET
);
2047 MemSubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
, SubTable
,
2048 sizeof (ACPI_PMTT_SOCKET
));
2050 while (((Offset
+ MemOffset
) < Table
->Length
) &&
2051 (MemOffset
< SubTable
->Length
))
2053 /* Common subtable header */
2055 AcpiOsPrintf ("\n");
2056 Status
= AcpiDmDumpTable (Length
,
2057 Offset
+ MemOffset
, MemSubTable
,
2058 MemSubTable
->Length
, AcpiDmTableInfoPmttHdr
);
2059 if (ACPI_FAILURE (Status
))
2064 /* Only memory controller subtables are expected at this level */
2066 if (MemSubTable
->Type
!= ACPI_PMTT_TYPE_CONTROLLER
)
2069 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2074 /* Dump the fixed-length portion of the controller subtable */
2076 Status
= AcpiDmDumpTable (Length
,
2077 Offset
+ MemOffset
, MemSubTable
,
2078 MemSubTable
->Length
, AcpiDmTableInfoPmtt1
);
2079 if (ACPI_FAILURE (Status
))
2084 /* Walk the variable count of proximity domains */
2086 DomainCount
= ((ACPI_PMTT_CONTROLLER
*) MemSubTable
)->DomainCount
;
2087 DomainOffset
= sizeof (ACPI_PMTT_CONTROLLER
);
2088 DomainArray
= ACPI_ADD_PTR (ACPI_PMTT_DOMAIN
, MemSubTable
,
2089 sizeof (ACPI_PMTT_CONTROLLER
));
2091 while (((Offset
+ MemOffset
+ DomainOffset
) < Table
->Length
) &&
2092 ((MemOffset
+ DomainOffset
) < SubTable
->Length
) &&
2095 Status
= AcpiDmDumpTable (Length
,
2096 Offset
+ MemOffset
+ DomainOffset
, DomainArray
,
2097 sizeof (ACPI_PMTT_DOMAIN
), AcpiDmTableInfoPmtt1a
);
2098 if (ACPI_FAILURE (Status
))
2103 DomainOffset
+= sizeof (ACPI_PMTT_DOMAIN
);
2111 "\n**** DomainCount exceeds subtable length\n\n",
2115 /* Walk the physical component (DIMM) subtables */
2117 DimmOffset
= DomainOffset
;
2118 DimmSubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
, MemSubTable
,
2121 while (((Offset
+ MemOffset
+ DimmOffset
) < Table
->Length
) &&
2122 (DimmOffset
< MemSubTable
->Length
))
2124 /* Common subtable header */
2126 AcpiOsPrintf ("\n");
2127 Status
= AcpiDmDumpTable (Length
,
2128 Offset
+ MemOffset
+ DimmOffset
, DimmSubTable
,
2129 DimmSubTable
->Length
, AcpiDmTableInfoPmttHdr
);
2130 if (ACPI_FAILURE (Status
))
2135 /* Only DIMM subtables are expected at this level */
2137 if (DimmSubTable
->Type
!= ACPI_PMTT_TYPE_DIMM
)
2140 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2141 DimmSubTable
->Type
);
2145 /* Dump the fixed-length DIMM subtable */
2147 Status
= AcpiDmDumpTable (Length
,
2148 Offset
+ MemOffset
+ DimmOffset
, DimmSubTable
,
2149 DimmSubTable
->Length
, AcpiDmTableInfoPmtt2
);
2150 if (ACPI_FAILURE (Status
))
2155 /* Point to next DIMM subtable */
2157 DimmOffset
+= DimmSubTable
->Length
;
2158 DimmSubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
,
2159 DimmSubTable
, DimmSubTable
->Length
);
2162 /* Point to next Controller subtable */
2164 MemOffset
+= MemSubTable
->Length
;
2165 MemSubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
,
2166 MemSubTable
, MemSubTable
->Length
);
2169 /* Point to next Socket subtable */
2171 Offset
+= SubTable
->Length
;
2172 SubTable
= ACPI_ADD_PTR (ACPI_PMTT_HEADER
,
2173 SubTable
, SubTable
->Length
);
2178 /*******************************************************************************
2180 * FUNCTION: AcpiDmDumpS3pt
2182 * PARAMETERS: Table - A S3PT table
2184 * RETURN: Length of the table
2186 * DESCRIPTION: Format the contents of a S3PT
2188 ******************************************************************************/
2192 ACPI_TABLE_HEADER
*Tables
)
2195 UINT32 Offset
= sizeof (ACPI_TABLE_S3PT
);
2196 ACPI_S3PT_HEADER
*SubTable
;
2197 ACPI_DMTABLE_INFO
*InfoTable
;
2198 ACPI_TABLE_S3PT
*S3ptTable
= ACPI_CAST_PTR (ACPI_TABLE_S3PT
, Tables
);
2203 Status
= AcpiDmDumpTable (Offset
, 0, S3ptTable
, 0, AcpiDmTableInfoS3pt
);
2204 if (ACPI_FAILURE (Status
))
2209 SubTable
= ACPI_ADD_PTR (ACPI_S3PT_HEADER
, S3ptTable
, Offset
);
2210 while (Offset
< S3ptTable
->Length
)
2212 /* Common sub-table header */
2214 AcpiOsPrintf ("\n");
2215 Status
= AcpiDmDumpTable (S3ptTable
->Length
, Offset
, SubTable
,
2216 SubTable
->Length
, AcpiDmTableInfoS3ptHdr
);
2217 if (ACPI_FAILURE (Status
))
2222 switch (SubTable
->Type
)
2224 case ACPI_S3PT_TYPE_RESUME
:
2226 InfoTable
= AcpiDmTableInfoS3pt0
;
2229 case ACPI_S3PT_TYPE_SUSPEND
:
2231 InfoTable
= AcpiDmTableInfoS3pt1
;
2236 AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable
->Type
);
2238 /* Attempt to continue */
2240 if (!SubTable
->Length
)
2242 AcpiOsPrintf ("Invalid zero length subtable\n");
2248 AcpiOsPrintf ("\n");
2249 Status
= AcpiDmDumpTable (S3ptTable
->Length
, Offset
, SubTable
,
2250 SubTable
->Length
, InfoTable
);
2251 if (ACPI_FAILURE (Status
))
2257 /* Point to next sub-table */
2259 Offset
+= SubTable
->Length
;
2260 SubTable
= ACPI_ADD_PTR (ACPI_S3PT_HEADER
, SubTable
, SubTable
->Length
);
2263 return (S3ptTable
->Length
);
2267 /*******************************************************************************
2269 * FUNCTION: AcpiDmDumpSlic
2271 * PARAMETERS: Table - A SLIC table
2275 * DESCRIPTION: Format the contents of a SLIC
2277 ******************************************************************************/
2281 ACPI_TABLE_HEADER
*Table
)
2284 UINT32 Offset
= sizeof (ACPI_TABLE_SLIC
);
2285 ACPI_SLIC_HEADER
*SubTable
;
2286 ACPI_DMTABLE_INFO
*InfoTable
;
2289 /* There is no main SLIC table, only subtables */
2291 SubTable
= ACPI_ADD_PTR (ACPI_SLIC_HEADER
, Table
, Offset
);
2292 while (Offset
< Table
->Length
)
2294 /* Common sub-table header */
2296 AcpiOsPrintf ("\n");
2297 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2298 SubTable
->Length
, AcpiDmTableInfoSlicHdr
);
2299 if (ACPI_FAILURE (Status
))
2304 switch (SubTable
->Type
)
2306 case ACPI_SLIC_TYPE_PUBLIC_KEY
:
2308 InfoTable
= AcpiDmTableInfoSlic0
;
2311 case ACPI_SLIC_TYPE_WINDOWS_MARKER
:
2313 InfoTable
= AcpiDmTableInfoSlic1
;
2318 AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable
->Type
);
2320 /* Attempt to continue */
2322 if (!SubTable
->Length
)
2324 AcpiOsPrintf ("Invalid zero length subtable\n");
2330 AcpiOsPrintf ("\n");
2331 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2332 SubTable
->Length
, InfoTable
);
2333 if (ACPI_FAILURE (Status
))
2339 /* Point to next sub-table */
2341 Offset
+= SubTable
->Length
;
2342 SubTable
= ACPI_ADD_PTR (ACPI_SLIC_HEADER
, SubTable
, SubTable
->Length
);
2347 /*******************************************************************************
2349 * FUNCTION: AcpiDmDumpSlit
2351 * PARAMETERS: Table - An SLIT
2355 * DESCRIPTION: Format the contents of a SLIT
2357 ******************************************************************************/
2361 ACPI_TABLE_HEADER
*Table
)
2373 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoSlit
);
2374 if (ACPI_FAILURE (Status
))
2379 /* Display the Locality NxN Matrix */
2381 Localities
= (UINT32
) ACPI_CAST_PTR (ACPI_TABLE_SLIT
, Table
)->LocalityCount
;
2382 Offset
= ACPI_OFFSET (ACPI_TABLE_SLIT
, Entry
[0]);
2383 Row
= (UINT8
*) ACPI_CAST_PTR (ACPI_TABLE_SLIT
, Table
)->Entry
;
2385 for (i
= 0; i
< Localities
; i
++)
2387 /* Display one row of the matrix */
2389 AcpiDmLineHeader2 (Offset
, Localities
, "Locality", i
);
2390 for (j
= 0; j
< Localities
; j
++)
2392 /* Check for beyond EOT */
2394 if (Offset
>= Table
->Length
)
2396 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
2400 AcpiOsPrintf ("%2.2X", Row
[j
]);
2403 /* Display up to 16 bytes per output row */
2405 if ((j
+1) < Localities
)
2409 if (j
&& (((j
+1) % 16) == 0))
2411 AcpiOsPrintf ("\\\n"); /* With line continuation char */
2412 AcpiDmLineHeader (Offset
, 0, NULL
);
2417 /* Point to next row */
2419 AcpiOsPrintf ("\n");
2425 /*******************************************************************************
2427 * FUNCTION: AcpiDmDumpSrat
2429 * PARAMETERS: Table - A SRAT table
2433 * DESCRIPTION: Format the contents of a SRAT
2435 ******************************************************************************/
2439 ACPI_TABLE_HEADER
*Table
)
2442 UINT32 Offset
= sizeof (ACPI_TABLE_SRAT
);
2443 ACPI_SUBTABLE_HEADER
*SubTable
;
2444 ACPI_DMTABLE_INFO
*InfoTable
;
2449 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoSrat
);
2450 if (ACPI_FAILURE (Status
))
2457 SubTable
= ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER
, Table
, Offset
);
2458 while (Offset
< Table
->Length
)
2460 /* Common sub-table header */
2462 AcpiOsPrintf ("\n");
2463 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2464 SubTable
->Length
, AcpiDmTableInfoSratHdr
);
2465 if (ACPI_FAILURE (Status
))
2470 switch (SubTable
->Type
)
2472 case ACPI_SRAT_TYPE_CPU_AFFINITY
:
2474 InfoTable
= AcpiDmTableInfoSrat0
;
2477 case ACPI_SRAT_TYPE_MEMORY_AFFINITY
:
2479 InfoTable
= AcpiDmTableInfoSrat1
;
2482 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY
:
2484 InfoTable
= AcpiDmTableInfoSrat2
;
2488 AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable
->Type
);
2490 /* Attempt to continue */
2492 if (!SubTable
->Length
)
2494 AcpiOsPrintf ("Invalid zero length subtable\n");
2500 AcpiOsPrintf ("\n");
2501 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2502 SubTable
->Length
, InfoTable
);
2503 if (ACPI_FAILURE (Status
))
2509 /* Point to next sub-table */
2511 Offset
+= SubTable
->Length
;
2512 SubTable
= ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER
, SubTable
, SubTable
->Length
);
2517 /*******************************************************************************
2519 * FUNCTION: AcpiDmDumpVrtc
2521 * PARAMETERS: Table - A VRTC table
2525 * DESCRIPTION: Format the contents of a VRTC
2527 ******************************************************************************/
2531 ACPI_TABLE_HEADER
*Table
)
2534 UINT32 Offset
= sizeof (ACPI_TABLE_VRTC
);
2535 ACPI_VRTC_ENTRY
*SubTable
;
2540 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoVrtc
);
2541 if (ACPI_FAILURE (Status
))
2548 SubTable
= ACPI_ADD_PTR (ACPI_VRTC_ENTRY
, Table
, Offset
);
2549 while (Offset
< Table
->Length
)
2551 /* Common sub-table header */
2553 AcpiOsPrintf ("\n");
2554 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2555 sizeof (ACPI_VRTC_ENTRY
), AcpiDmTableInfoVrtc0
);
2556 if (ACPI_FAILURE (Status
))
2561 /* Point to next sub-table */
2563 Offset
+= sizeof (ACPI_VRTC_ENTRY
);
2564 SubTable
= ACPI_ADD_PTR (ACPI_VRTC_ENTRY
, SubTable
, sizeof (ACPI_VRTC_ENTRY
));
2569 /*******************************************************************************
2571 * FUNCTION: AcpiDmDumpWdat
2573 * PARAMETERS: Table - A WDAT table
2577 * DESCRIPTION: Format the contents of a WDAT
2579 ******************************************************************************/
2583 ACPI_TABLE_HEADER
*Table
)
2586 UINT32 Offset
= sizeof (ACPI_TABLE_WDAT
);
2587 ACPI_WDAT_ENTRY
*SubTable
;
2592 Status
= AcpiDmDumpTable (Table
->Length
, 0, Table
, 0, AcpiDmTableInfoWdat
);
2593 if (ACPI_FAILURE (Status
))
2600 SubTable
= ACPI_ADD_PTR (ACPI_WDAT_ENTRY
, Table
, Offset
);
2601 while (Offset
< Table
->Length
)
2603 /* Common sub-table header */
2605 AcpiOsPrintf ("\n");
2606 Status
= AcpiDmDumpTable (Table
->Length
, Offset
, SubTable
,
2607 sizeof (ACPI_WDAT_ENTRY
), AcpiDmTableInfoWdat0
);
2608 if (ACPI_FAILURE (Status
))
2613 /* Point to next sub-table */
2615 Offset
+= sizeof (ACPI_WDAT_ENTRY
);
2616 SubTable
= ACPI_ADD_PTR (ACPI_WDAT_ENTRY
, SubTable
, sizeof (ACPI_WDAT_ENTRY
));