xref: /freebsd/sys/contrib/dev/acpica/common/dmtbdump.c (revision 396c556d77189a5c474d35cec6f44a762e310b7d)
1 /******************************************************************************
2  *
3  * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************
115  *
116  * Alternatively, you may choose to be licensed under the terms of the
117  * following license:
118  *
119  * Redistribution and use in source and binary forms, with or without
120  * modification, are permitted provided that the following conditions
121  * are met:
122  * 1. Redistributions of source code must retain the above copyright
123  *    notice, this list of conditions, and the following disclaimer,
124  *    without modification.
125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126  *    substantially similar to the "NO WARRANTY" disclaimer below
127  *    ("Disclaimer") and any redistribution must be conditioned upon
128  *    including a substantially similar Disclaimer requirement for further
129  *    binary redistribution.
130  * 3. Neither the names of the above-listed copyright holders nor the names
131  *    of any contributors may be used to endorse or promote products derived
132  *    from this software without specific prior written permission.
133  *
134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145  *
146  * Alternatively, you may choose to be licensed under the terms of the
147  * GNU General Public License ("GPL") version 2 as published by the Free
148  * Software Foundation.
149  *
150  *****************************************************************************/
151 
152 #include <contrib/dev/acpica/include/acpi.h>
153 #include <contrib/dev/acpica/include/accommon.h>
154 #include <contrib/dev/acpica/include/acdisasm.h>
155 #include <contrib/dev/acpica/include/actables.h>
156 
157 /* This module used for application-level code only */
158 
159 #define _COMPONENT          ACPI_CA_DISASSEMBLER
160         ACPI_MODULE_NAME    ("dmtbdump")
161 
162 
163 /* Local prototypes */
164 
165 static void
166 AcpiDmValidateFadtLength (
167     UINT32                  Revision,
168     UINT32                  Length);
169 
170 
171 /*******************************************************************************
172  *
173  * FUNCTION:    AcpiDmDumpBuffer
174  *
175  * PARAMETERS:  Table               - ACPI Table or subtable
176  *              BufferOffset        - Offset of buffer from Table above
177  *              Length              - Length of the buffer
178  *              AbsoluteOffset      - Offset of buffer in the main ACPI table
179  *              Header              - Name of the buffer field (printed on the
180  *                                    first line only.)
181  *
182  * RETURN:      None
183  *
184  * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
185  *              disassembler output format.)
186  *
187  ******************************************************************************/
188 
189 void
190 AcpiDmDumpBuffer (
191     void                    *Table,
192     UINT32                  BufferOffset,
193     UINT32                  Length,
194     UINT32                  AbsoluteOffset,
195     char                    *Header)
196 {
197     UINT8                   *Buffer;
198     UINT32                  i;
199 
200 
201     if (!Length)
202     {
203         return;
204     }
205 
206     Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
207     i = 0;
208 
209     while (i < Length)
210     {
211         if (!(i % 16))
212         {
213             /* Insert a backslash - line continuation character */
214 
215             if (Length > 16)
216             {
217                 AcpiOsPrintf ("\\\n    ");
218             }
219         }
220 
221         AcpiOsPrintf ("%.02X ", *Buffer);
222         i++;
223         Buffer++;
224         AbsoluteOffset++;
225     }
226 
227     AcpiOsPrintf ("\n");
228 }
229 
230 
231 /*******************************************************************************
232  *
233  * FUNCTION:    AcpiDmDumpUnicode
234  *
235  * PARAMETERS:  Table               - ACPI Table or subtable
236  *              BufferOffset        - Offset of buffer from Table above
237  *              ByteLength          - Length of the buffer
238  *
239  * RETURN:      None
240  *
241  * DESCRIPTION: Validate and dump the contents of a buffer that contains
242  *              unicode data. The output is a standard ASCII string. If it
243  *              appears that the data is not unicode, the buffer is dumped
244  *              as hex characters.
245  *
246  ******************************************************************************/
247 
248 void
249 AcpiDmDumpUnicode (
250     void                    *Table,
251     UINT32                  BufferOffset,
252     UINT32                  ByteLength)
253 {
254     UINT8                   *Buffer;
255     UINT32                  Length;
256     UINT32                  i;
257 
258 
259     Buffer = ((UINT8 *) Table) + BufferOffset;
260     Length = ByteLength - 2; /* Last two bytes are the null terminator */
261 
262     /* Ensure all low bytes are entirely printable ASCII */
263 
264     for (i = 0; i < Length; i += 2)
265     {
266         if (!isprint (Buffer[i]))
267         {
268             goto DumpRawBuffer;
269         }
270     }
271 
272     /* Ensure all high bytes are zero */
273 
274     for (i = 1; i < Length; i += 2)
275     {
276         if (Buffer[i])
277         {
278             goto DumpRawBuffer;
279         }
280     }
281 
282     /* Dump the buffer as a normal string */
283 
284     AcpiOsPrintf ("\"");
285     for (i = 0; i < Length; i += 2)
286     {
287         AcpiOsPrintf ("%c", Buffer[i]);
288     }
289 
290     AcpiOsPrintf ("\"\n");
291     return;
292 
293 DumpRawBuffer:
294     AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
295         BufferOffset, NULL);
296     AcpiOsPrintf ("\n");
297 }
298 
299 
300 /*******************************************************************************
301  *
302  * FUNCTION:    AcpiDmDumpRsdp
303  *
304  * PARAMETERS:  Table               - A RSDP
305  *
306  * RETURN:      Length of the table (there is not always a length field,
307  *              use revision or length if available (ACPI 2.0+))
308  *
309  * DESCRIPTION: Format the contents of a RSDP
310  *
311  ******************************************************************************/
312 
313 UINT32
314 AcpiDmDumpRsdp (
315     ACPI_TABLE_HEADER       *Table)
316 {
317     ACPI_TABLE_RSDP         *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
318     UINT32                  Length = sizeof (ACPI_RSDP_COMMON);
319     UINT8                   Checksum;
320     ACPI_STATUS             Status;
321 
322 
323     /* Dump the common ACPI 1.0 portion */
324 
325     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
326     if (ACPI_FAILURE (Status))
327     {
328         return (Length);
329     }
330 
331     /* Validate the first checksum */
332 
333     Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
334         Rsdp->Checksum);
335     if (Checksum != Rsdp->Checksum)
336     {
337         AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
338             Checksum);
339     }
340 
341     /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
342 
343     if (Rsdp->Revision > 0)
344     {
345         Length = Rsdp->Length;
346         Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
347         if (ACPI_FAILURE (Status))
348         {
349             return (Length);
350         }
351 
352         /* Validate the extended checksum over entire RSDP */
353 
354         Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
355             Rsdp->ExtendedChecksum);
356         if (Checksum != Rsdp->ExtendedChecksum)
357         {
358             AcpiOsPrintf (
359                 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
360                 Checksum);
361         }
362     }
363 
364     return (Length);
365 }
366 
367 
368 /*******************************************************************************
369  *
370  * FUNCTION:    AcpiDmDumpRsdt
371  *
372  * PARAMETERS:  Table               - A RSDT
373  *
374  * RETURN:      None
375  *
376  * DESCRIPTION: Format the contents of a RSDT
377  *
378  ******************************************************************************/
379 
380 void
381 AcpiDmDumpRsdt (
382     ACPI_TABLE_HEADER       *Table)
383 {
384     UINT32                  *Array;
385     UINT32                  Entries;
386     UINT32                  Offset;
387     UINT32                  i;
388 
389 
390     /* Point to start of table pointer array */
391 
392     Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
393     Offset = sizeof (ACPI_TABLE_HEADER);
394 
395     /* RSDT uses 32-bit pointers */
396 
397     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
398 
399     for (i = 0; i < Entries; i++)
400     {
401         AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
402         AcpiOsPrintf ("%8.8X\n", Array[i]);
403         Offset += sizeof (UINT32);
404     }
405 }
406 
407 
408 /*******************************************************************************
409  *
410  * FUNCTION:    AcpiDmDumpXsdt
411  *
412  * PARAMETERS:  Table               - A XSDT
413  *
414  * RETURN:      None
415  *
416  * DESCRIPTION: Format the contents of a XSDT
417  *
418  ******************************************************************************/
419 
420 void
421 AcpiDmDumpXsdt (
422     ACPI_TABLE_HEADER       *Table)
423 {
424     UINT64                  *Array;
425     UINT32                  Entries;
426     UINT32                  Offset;
427     UINT32                  i;
428 
429 
430     /* Point to start of table pointer array */
431 
432     Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
433     Offset = sizeof (ACPI_TABLE_HEADER);
434 
435     /* XSDT uses 64-bit pointers */
436 
437     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
438 
439     for (i = 0; i < Entries; i++)
440     {
441         AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
442         AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
443         Offset += sizeof (UINT64);
444     }
445 }
446 
447 
448 /*******************************************************************************
449  *
450  * FUNCTION:    AcpiDmDumpFadt
451  *
452  * PARAMETERS:  Table               - A FADT
453  *
454  * RETURN:      None
455  *
456  * DESCRIPTION: Format the contents of a FADT
457  *
458  * NOTE:        We cannot depend on the FADT version to indicate the actual
459  *              contents of the FADT because of BIOS bugs. The table length
460  *              is the only reliable indicator.
461  *
462  ******************************************************************************/
463 
464 void
465 AcpiDmDumpFadt (
466     ACPI_TABLE_HEADER       *Table)
467 {
468     ACPI_STATUS             Status;
469 
470 
471     /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
472 
473     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
474         AcpiDmTableInfoFadt1);
475     if (ACPI_FAILURE (Status))
476     {
477         return;
478     }
479 
480     /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
481 
482     if ((Table->Length > ACPI_FADT_V1_SIZE) &&
483         (Table->Length <= ACPI_FADT_V2_SIZE))
484     {
485         Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
486             AcpiDmTableInfoFadt2);
487         if (ACPI_FAILURE (Status))
488         {
489             return;
490         }
491     }
492 
493     /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
494 
495     else if (Table->Length > ACPI_FADT_V2_SIZE)
496     {
497         Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
498             AcpiDmTableInfoFadt3);
499         if (ACPI_FAILURE (Status))
500         {
501             return;
502         }
503 
504         /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
505 
506         if (Table->Length > ACPI_FADT_V3_SIZE)
507         {
508             Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
509                 AcpiDmTableInfoFadt5);
510             if (ACPI_FAILURE (Status))
511             {
512                 return;
513             }
514         }
515 
516         /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
517 
518         if (Table->Length > ACPI_FADT_V3_SIZE)
519         {
520             Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
521                 AcpiDmTableInfoFadt6);
522             if (ACPI_FAILURE (Status))
523             {
524                 return;
525             }
526         }
527     }
528 
529     /* Validate various fields in the FADT, including length */
530 
531     AcpiTbCreateLocalFadt (Table, Table->Length);
532 
533     /* Validate FADT length against the revision */
534 
535     AcpiDmValidateFadtLength (Table->Revision, Table->Length);
536 }
537 
538 
539 /*******************************************************************************
540  *
541  * FUNCTION:    AcpiDmValidateFadtLength
542  *
543  * PARAMETERS:  Revision            - FADT revision (Header->Revision)
544  *              Length              - FADT length (Header->Length
545  *
546  * RETURN:      None
547  *
548  * DESCRIPTION: Check the FADT revision against the expected table length for
549  *              that revision. Issue a warning if the length is not what was
550  *              expected. This seems to be such a common BIOS bug that the
551  *              FADT revision has been rendered virtually meaningless.
552  *
553  ******************************************************************************/
554 
555 static void
556 AcpiDmValidateFadtLength (
557     UINT32                  Revision,
558     UINT32                  Length)
559 {
560     UINT32                  ExpectedLength;
561 
562 
563     switch (Revision)
564     {
565     case 0:
566 
567         AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
568         return;
569 
570     case 1:
571 
572         ExpectedLength = ACPI_FADT_V1_SIZE;
573         break;
574 
575     case 2:
576 
577         ExpectedLength = ACPI_FADT_V2_SIZE;
578         break;
579 
580     case 3:
581     case 4:
582 
583         ExpectedLength = ACPI_FADT_V3_SIZE;
584         break;
585 
586     case 5:
587 
588         ExpectedLength = ACPI_FADT_V5_SIZE;
589         break;
590 
591     default:
592 
593         return;
594     }
595 
596     if (Length == ExpectedLength)
597     {
598         return;
599     }
600 
601     AcpiOsPrintf (
602         "\n// ACPI Warning: FADT revision %X does not match length: "
603         "found %X expected %X\n",
604         Revision, Length, ExpectedLength);
605 }
606 
607 
608 /*******************************************************************************
609  *
610  * FUNCTION:    AcpiDmDumpAsf
611  *
612  * PARAMETERS:  Table               - A ASF table
613  *
614  * RETURN:      None
615  *
616  * DESCRIPTION: Format the contents of a ASF table
617  *
618  ******************************************************************************/
619 
620 void
621 AcpiDmDumpAsf (
622     ACPI_TABLE_HEADER       *Table)
623 {
624     ACPI_STATUS             Status;
625     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
626     ACPI_ASF_INFO           *Subtable;
627     ACPI_DMTABLE_INFO       *InfoTable;
628     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
629     UINT8                   *DataTable = NULL;
630     UINT32                  DataCount = 0;
631     UINT32                  DataLength = 0;
632     UINT32                  DataOffset = 0;
633     UINT32                  i;
634     UINT8                   Type;
635 
636 
637     /* No main table, only subtables */
638 
639     Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
640     while (Offset < Table->Length)
641     {
642         /* Common subtable header */
643 
644         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
645             Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
646         if (ACPI_FAILURE (Status))
647         {
648             return;
649         }
650 
651         /* The actual type is the lower 7 bits of Type */
652 
653         Type = (UINT8) (Subtable->Header.Type & 0x7F);
654 
655         switch (Type)
656         {
657         case ACPI_ASF_TYPE_INFO:
658 
659             InfoTable = AcpiDmTableInfoAsf0;
660             break;
661 
662         case ACPI_ASF_TYPE_ALERT:
663 
664             InfoTable = AcpiDmTableInfoAsf1;
665             DataInfoTable = AcpiDmTableInfoAsf1a;
666             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
667             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
668             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
669             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
670             break;
671 
672         case ACPI_ASF_TYPE_CONTROL:
673 
674             InfoTable = AcpiDmTableInfoAsf2;
675             DataInfoTable = AcpiDmTableInfoAsf2a;
676             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
677             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
678             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
679             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
680             break;
681 
682         case ACPI_ASF_TYPE_BOOT:
683 
684             InfoTable = AcpiDmTableInfoAsf3;
685             break;
686 
687         case ACPI_ASF_TYPE_ADDRESS:
688 
689             InfoTable = AcpiDmTableInfoAsf4;
690             DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
691             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
692             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
693             break;
694 
695         default:
696 
697             AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
698                 Subtable->Header.Type);
699             return;
700         }
701 
702         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
703             Subtable->Header.Length, InfoTable);
704         if (ACPI_FAILURE (Status))
705         {
706             return;
707         }
708 
709         /* Dump variable-length extra data */
710 
711         switch (Type)
712         {
713         case ACPI_ASF_TYPE_ALERT:
714         case ACPI_ASF_TYPE_CONTROL:
715 
716             for (i = 0; i < DataCount; i++)
717             {
718                 AcpiOsPrintf ("\n");
719                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
720                     DataTable, DataLength, DataInfoTable);
721                 if (ACPI_FAILURE (Status))
722                 {
723                     return;
724                 }
725 
726                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
727                 DataOffset += DataLength;
728             }
729             break;
730 
731         case ACPI_ASF_TYPE_ADDRESS:
732 
733             for (i = 0; i < DataLength; i++)
734             {
735                 if (!(i % 16))
736                 {
737                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
738                 }
739 
740                 AcpiOsPrintf ("%2.2X ", *DataTable);
741                 DataTable++;
742                 DataOffset++;
743 
744                 if (DataOffset > Table->Length)
745                 {
746                     AcpiOsPrintf (
747                         "**** ACPI table terminates in the middle of a "
748                         "data structure! (ASF! table)\n");
749                     return;
750                 }
751             }
752 
753             AcpiOsPrintf ("\n");
754             break;
755 
756         default:
757 
758             break;
759         }
760 
761         AcpiOsPrintf ("\n");
762 
763         /* Point to next subtable */
764 
765         if (!Subtable->Header.Length)
766         {
767             AcpiOsPrintf ("Invalid zero subtable header length\n");
768             return;
769         }
770 
771         Offset += Subtable->Header.Length;
772         Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
773             Subtable->Header.Length);
774     }
775 }
776 
777 
778 /*******************************************************************************
779  *
780  * FUNCTION:    AcpiDmDumpCpep
781  *
782  * PARAMETERS:  Table               - A CPEP table
783  *
784  * RETURN:      None
785  *
786  * DESCRIPTION: Format the contents of a CPEP. This table type consists
787  *              of an open-ended number of subtables.
788  *
789  ******************************************************************************/
790 
791 void
792 AcpiDmDumpCpep (
793     ACPI_TABLE_HEADER       *Table)
794 {
795     ACPI_STATUS             Status;
796     ACPI_CPEP_POLLING       *Subtable;
797     UINT32                  Length = Table->Length;
798     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
799 
800 
801     /* Main table */
802 
803     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
804     if (ACPI_FAILURE (Status))
805     {
806         return;
807     }
808 
809     /* Subtables */
810 
811     Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
812     while (Offset < Table->Length)
813     {
814         AcpiOsPrintf ("\n");
815         Status = AcpiDmDumpTable (Length, Offset, Subtable,
816             Subtable->Header.Length, AcpiDmTableInfoCpep0);
817         if (ACPI_FAILURE (Status))
818         {
819             return;
820         }
821 
822         /* Point to next subtable */
823 
824         Offset += Subtable->Header.Length;
825         Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
826             Subtable->Header.Length);
827     }
828 }
829 
830 
831 /*******************************************************************************
832  *
833  * FUNCTION:    AcpiDmDumpCsrt
834  *
835  * PARAMETERS:  Table               - A CSRT table
836  *
837  * RETURN:      None
838  *
839  * DESCRIPTION: Format the contents of a CSRT. This table type consists
840  *              of an open-ended number of subtables.
841  *
842  ******************************************************************************/
843 
844 void
845 AcpiDmDumpCsrt (
846     ACPI_TABLE_HEADER       *Table)
847 {
848     ACPI_STATUS             Status;
849     ACPI_CSRT_GROUP         *Subtable;
850     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
851     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
852     UINT32                  Length = Table->Length;
853     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
854     UINT32                  SubOffset;
855     UINT32                  SubSubOffset;
856     UINT32                  InfoLength;
857 
858 
859     /* The main table only contains the ACPI header, thus already handled */
860 
861     /* Subtables (Resource Groups) */
862 
863     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
864     while (Offset < Table->Length)
865     {
866         /* Resource group subtable */
867 
868         AcpiOsPrintf ("\n");
869         Status = AcpiDmDumpTable (Length, Offset, Subtable,
870             Subtable->Length, AcpiDmTableInfoCsrt0);
871         if (ACPI_FAILURE (Status))
872         {
873             return;
874         }
875 
876         /* Shared info subtable (One per resource group) */
877 
878         SubOffset = sizeof (ACPI_CSRT_GROUP);
879         SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
880             Offset + SubOffset);
881 
882         AcpiOsPrintf ("\n");
883         Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
884             sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
885         if (ACPI_FAILURE (Status))
886         {
887             return;
888         }
889 
890         SubOffset += Subtable->SharedInfoLength;
891 
892         /* Sub-Subtables (Resource Descriptors) */
893 
894         SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
895             Offset + SubOffset);
896 
897         while ((SubOffset < Subtable->Length) &&
898               ((Offset + SubOffset) < Table->Length))
899         {
900             AcpiOsPrintf ("\n");
901             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
902                 SubSubtable->Length, AcpiDmTableInfoCsrt2);
903             if (ACPI_FAILURE (Status))
904             {
905                 return;
906             }
907 
908             SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
909 
910             /* Resource-specific info buffer */
911 
912             InfoLength = SubSubtable->Length - SubSubOffset;
913             if (InfoLength)
914             {
915                 Status = AcpiDmDumpTable (Length,
916                     Offset + SubOffset + SubSubOffset, Table,
917                     InfoLength, AcpiDmTableInfoCsrt2a);
918                 if (ACPI_FAILURE (Status))
919                 {
920                     return;
921                 }
922                 SubSubOffset += InfoLength;
923             }
924 
925             /* Point to next sub-subtable */
926 
927             SubOffset += SubSubtable->Length;
928             SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
929                 SubSubtable->Length);
930         }
931 
932         /* Point to next subtable */
933 
934         Offset += Subtable->Length;
935         Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
936             Subtable->Length);
937     }
938 }
939 
940 
941 /*******************************************************************************
942  *
943  * FUNCTION:    AcpiDmDumpDbg2
944  *
945  * PARAMETERS:  Table               - A DBG2 table
946  *
947  * RETURN:      None
948  *
949  * DESCRIPTION: Format the contents of a DBG2. This table type consists
950  *              of an open-ended number of subtables.
951  *
952  ******************************************************************************/
953 
954 void
955 AcpiDmDumpDbg2 (
956     ACPI_TABLE_HEADER       *Table)
957 {
958     ACPI_STATUS             Status;
959     ACPI_DBG2_DEVICE        *Subtable;
960     UINT32                  Length = Table->Length;
961     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
962     UINT32                  i;
963     UINT32                  ArrayOffset;
964     UINT32                  AbsoluteOffset;
965     UINT8                   *Array;
966 
967 
968     /* Main table */
969 
970     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
971     if (ACPI_FAILURE (Status))
972     {
973         return;
974     }
975 
976     /* Subtables */
977 
978     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
979     while (Offset < Table->Length)
980     {
981         AcpiOsPrintf ("\n");
982         Status = AcpiDmDumpTable (Length, Offset, Subtable,
983             Subtable->Length, AcpiDmTableInfoDbg2Device);
984         if (ACPI_FAILURE (Status))
985         {
986             return;
987         }
988 
989         /* Dump the BaseAddress array */
990 
991         for (i = 0; i < Subtable->RegisterCount; i++)
992         {
993             ArrayOffset = Subtable->BaseAddressOffset +
994                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
995             AbsoluteOffset = Offset + ArrayOffset;
996             Array = (UINT8 *) Subtable + ArrayOffset;
997 
998             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
999                 Subtable->Length, AcpiDmTableInfoDbg2Addr);
1000             if (ACPI_FAILURE (Status))
1001             {
1002                 return;
1003             }
1004         }
1005 
1006         /* Dump the AddressSize array */
1007 
1008         for (i = 0; i < Subtable->RegisterCount; i++)
1009         {
1010             ArrayOffset = Subtable->AddressSizeOffset +
1011                 (sizeof (UINT32) * i);
1012             AbsoluteOffset = Offset + ArrayOffset;
1013             Array = (UINT8 *) Subtable + ArrayOffset;
1014 
1015             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1016                 Subtable->Length, AcpiDmTableInfoDbg2Size);
1017             if (ACPI_FAILURE (Status))
1018             {
1019                 return;
1020             }
1021         }
1022 
1023         /* Dump the Namestring (required) */
1024 
1025         AcpiOsPrintf ("\n");
1026         ArrayOffset = Subtable->NamepathOffset;
1027         AbsoluteOffset = Offset + ArrayOffset;
1028         Array = (UINT8 *) Subtable + ArrayOffset;
1029 
1030         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1031             Subtable->Length, AcpiDmTableInfoDbg2Name);
1032         if (ACPI_FAILURE (Status))
1033         {
1034             return;
1035         }
1036 
1037         /* Dump the OemData (optional) */
1038 
1039         if (Subtable->OemDataOffset)
1040         {
1041             Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
1042                 Table, Subtable->OemDataLength,
1043                 AcpiDmTableInfoDbg2OemData);
1044             if (ACPI_FAILURE (Status))
1045             {
1046                 return;
1047             }
1048         }
1049 
1050         /* Point to next subtable */
1051 
1052         Offset += Subtable->Length;
1053         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
1054             Subtable->Length);
1055     }
1056 }
1057 
1058 
1059 /*******************************************************************************
1060  *
1061  * FUNCTION:    AcpiDmDumpDmar
1062  *
1063  * PARAMETERS:  Table               - A DMAR table
1064  *
1065  * RETURN:      None
1066  *
1067  * DESCRIPTION: Format the contents of a DMAR. This table type consists
1068  *              of an open-ended number of subtables.
1069  *
1070  ******************************************************************************/
1071 
1072 void
1073 AcpiDmDumpDmar (
1074     ACPI_TABLE_HEADER       *Table)
1075 {
1076     ACPI_STATUS             Status;
1077     ACPI_DMAR_HEADER        *Subtable;
1078     UINT32                  Length = Table->Length;
1079     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
1080     ACPI_DMTABLE_INFO       *InfoTable;
1081     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
1082     UINT32                  ScopeOffset;
1083     UINT8                   *PciPath;
1084     UINT32                  PathOffset;
1085 
1086 
1087     /* Main table */
1088 
1089     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
1090     if (ACPI_FAILURE (Status))
1091     {
1092         return;
1093     }
1094 
1095     /* Subtables */
1096 
1097     Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
1098     while (Offset < Table->Length)
1099     {
1100         /* Common subtable header */
1101 
1102         AcpiOsPrintf ("\n");
1103         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1104             Subtable->Length, AcpiDmTableInfoDmarHdr);
1105         if (ACPI_FAILURE (Status))
1106         {
1107             return;
1108         }
1109 
1110         AcpiOsPrintf ("\n");
1111 
1112         switch (Subtable->Type)
1113         {
1114         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
1115 
1116             InfoTable = AcpiDmTableInfoDmar0;
1117             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
1118             break;
1119 
1120         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
1121 
1122             InfoTable = AcpiDmTableInfoDmar1;
1123             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
1124             break;
1125 
1126         case ACPI_DMAR_TYPE_ROOT_ATS:
1127 
1128             InfoTable = AcpiDmTableInfoDmar2;
1129             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1130             break;
1131 
1132         case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1133 
1134             InfoTable = AcpiDmTableInfoDmar3;
1135             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1136             break;
1137 
1138         case ACPI_DMAR_TYPE_NAMESPACE:
1139 
1140             InfoTable = AcpiDmTableInfoDmar4;
1141             ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1142             break;
1143 
1144         default:
1145 
1146             AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
1147                 Subtable->Type);
1148             return;
1149         }
1150 
1151         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1152             Subtable->Length, InfoTable);
1153         if (ACPI_FAILURE (Status))
1154         {
1155             return;
1156         }
1157 
1158         /*
1159          * Dump the optional device scope entries
1160          */
1161         if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1162             (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1163         {
1164             /* These types do not support device scopes */
1165 
1166             goto NextSubtable;
1167         }
1168 
1169         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
1170         while (ScopeOffset < Subtable->Length)
1171         {
1172             AcpiOsPrintf ("\n");
1173             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1174                 ScopeTable->Length, AcpiDmTableInfoDmarScope);
1175             if (ACPI_FAILURE (Status))
1176             {
1177                 return;
1178             }
1179             AcpiOsPrintf ("\n");
1180 
1181             /* Dump the PCI Path entries for this device scope */
1182 
1183             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1184 
1185             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1186                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
1187 
1188             while (PathOffset < ScopeTable->Length)
1189             {
1190                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
1191                     "PCI Path");
1192                 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1193 
1194                 /* Point to next PCI Path entry */
1195 
1196                 PathOffset += 2;
1197                 PciPath += 2;
1198                 AcpiOsPrintf ("\n");
1199             }
1200 
1201             /* Point to next device scope entry */
1202 
1203             ScopeOffset += ScopeTable->Length;
1204             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1205                 ScopeTable, ScopeTable->Length);
1206         }
1207 
1208 NextSubtable:
1209         /* Point to next subtable */
1210 
1211         Offset += Subtable->Length;
1212         Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
1213             Subtable->Length);
1214     }
1215 }
1216 
1217 
1218 /*******************************************************************************
1219  *
1220  * FUNCTION:    AcpiDmDumpDrtm
1221  *
1222  * PARAMETERS:  Table               - A DRTM table
1223  *
1224  * RETURN:      None
1225  *
1226  * DESCRIPTION: Format the contents of a DRTM.
1227  *
1228  ******************************************************************************/
1229 
1230 void
1231 AcpiDmDumpDrtm (
1232     ACPI_TABLE_HEADER       *Table)
1233 {
1234     ACPI_STATUS             Status;
1235     UINT32                  Offset;
1236     ACPI_DRTM_VTABLE_LIST   *DrtmVtl;
1237     ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1238     ACPI_DRTM_DPS_ID        *DrtmDps;
1239     UINT32                  Count;
1240 
1241 
1242     /* Main table */
1243 
1244     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1245         AcpiDmTableInfoDrtm);
1246     if (ACPI_FAILURE (Status))
1247     {
1248         return;
1249     }
1250 
1251     Offset = sizeof (ACPI_TABLE_DRTM);
1252 
1253     /* Sub-tables */
1254 
1255     /* Dump ValidatedTable length */
1256 
1257     DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1258     AcpiOsPrintf ("\n");
1259     Status = AcpiDmDumpTable (Table->Length, Offset,
1260         DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1261         AcpiDmTableInfoDrtm0);
1262     if (ACPI_FAILURE (Status))
1263     {
1264             return;
1265     }
1266 
1267     Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1268 
1269     /* Dump Validated table addresses */
1270 
1271     Count = 0;
1272     while ((Offset < Table->Length) &&
1273             (DrtmVtl->ValidatedTableCount > Count))
1274     {
1275         Status = AcpiDmDumpTable (Table->Length, Offset,
1276             ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1277             AcpiDmTableInfoDrtm0a);
1278         if (ACPI_FAILURE (Status))
1279         {
1280             return;
1281         }
1282 
1283         Offset += sizeof (UINT64);
1284         Count++;
1285     }
1286 
1287     /* Dump ResourceList length */
1288 
1289     DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1290     AcpiOsPrintf ("\n");
1291     Status = AcpiDmDumpTable (Table->Length, Offset,
1292         DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1293         AcpiDmTableInfoDrtm1);
1294     if (ACPI_FAILURE (Status))
1295     {
1296         return;
1297     }
1298 
1299     Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1300 
1301     /* Dump the Resource List */
1302 
1303     Count = 0;
1304     while ((Offset < Table->Length) &&
1305            (DrtmRl->ResourceCount > Count))
1306     {
1307         Status = AcpiDmDumpTable (Table->Length, Offset,
1308             ACPI_ADD_PTR (void, Table, Offset),
1309             sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
1310         if (ACPI_FAILURE (Status))
1311         {
1312             return;
1313         }
1314 
1315         Offset += sizeof (ACPI_DRTM_RESOURCE);
1316         Count++;
1317     }
1318 
1319     /* Dump DPS */
1320 
1321     DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1322     AcpiOsPrintf ("\n");
1323     (void) AcpiDmDumpTable (Table->Length, Offset,
1324         DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
1325 }
1326 
1327 
1328 /*******************************************************************************
1329  *
1330  * FUNCTION:    AcpiDmDumpEinj
1331  *
1332  * PARAMETERS:  Table               - A EINJ table
1333  *
1334  * RETURN:      None
1335  *
1336  * DESCRIPTION: Format the contents of a EINJ. This table type consists
1337  *              of an open-ended number of subtables.
1338  *
1339  ******************************************************************************/
1340 
1341 void
1342 AcpiDmDumpEinj (
1343     ACPI_TABLE_HEADER       *Table)
1344 {
1345     ACPI_STATUS             Status;
1346     ACPI_WHEA_HEADER        *Subtable;
1347     UINT32                  Length = Table->Length;
1348     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
1349 
1350 
1351     /* Main table */
1352 
1353     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1354     if (ACPI_FAILURE (Status))
1355     {
1356         return;
1357     }
1358 
1359     /* Subtables */
1360 
1361     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1362     while (Offset < Table->Length)
1363     {
1364         AcpiOsPrintf ("\n");
1365         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1366             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1367         if (ACPI_FAILURE (Status))
1368         {
1369             return;
1370         }
1371 
1372         /* Point to next subtable (each subtable is of fixed length) */
1373 
1374         Offset += sizeof (ACPI_WHEA_HEADER);
1375         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1376             sizeof (ACPI_WHEA_HEADER));
1377     }
1378 }
1379 
1380 
1381 /*******************************************************************************
1382  *
1383  * FUNCTION:    AcpiDmDumpErst
1384  *
1385  * PARAMETERS:  Table               - A ERST table
1386  *
1387  * RETURN:      None
1388  *
1389  * DESCRIPTION: Format the contents of a ERST. This table type consists
1390  *              of an open-ended number of subtables.
1391  *
1392  ******************************************************************************/
1393 
1394 void
1395 AcpiDmDumpErst (
1396     ACPI_TABLE_HEADER       *Table)
1397 {
1398     ACPI_STATUS             Status;
1399     ACPI_WHEA_HEADER        *Subtable;
1400     UINT32                  Length = Table->Length;
1401     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
1402 
1403 
1404     /* Main table */
1405 
1406     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1407     if (ACPI_FAILURE (Status))
1408     {
1409         return;
1410     }
1411 
1412     /* Subtables */
1413 
1414     Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1415     while (Offset < Table->Length)
1416     {
1417         AcpiOsPrintf ("\n");
1418         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1419             sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1420         if (ACPI_FAILURE (Status))
1421         {
1422             return;
1423         }
1424 
1425         /* Point to next subtable (each subtable is of fixed length) */
1426 
1427         Offset += sizeof (ACPI_WHEA_HEADER);
1428         Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1429             sizeof (ACPI_WHEA_HEADER));
1430     }
1431 }
1432 
1433 
1434 /*******************************************************************************
1435  *
1436  * FUNCTION:    AcpiDmDumpFpdt
1437  *
1438  * PARAMETERS:  Table               - A FPDT table
1439  *
1440  * RETURN:      None
1441  *
1442  * DESCRIPTION: Format the contents of a FPDT. This table type consists
1443  *              of an open-ended number of subtables.
1444  *
1445  ******************************************************************************/
1446 
1447 void
1448 AcpiDmDumpFpdt (
1449     ACPI_TABLE_HEADER       *Table)
1450 {
1451     ACPI_STATUS             Status;
1452     ACPI_FPDT_HEADER        *Subtable;
1453     UINT32                  Length = Table->Length;
1454     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
1455     ACPI_DMTABLE_INFO       *InfoTable;
1456 
1457 
1458     /* There is no main table (other than the standard ACPI header) */
1459 
1460     /* Subtables */
1461 
1462     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1463     while (Offset < Table->Length)
1464     {
1465         /* Common subtable header */
1466 
1467         AcpiOsPrintf ("\n");
1468         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1469             Subtable->Length, AcpiDmTableInfoFpdtHdr);
1470         if (ACPI_FAILURE (Status))
1471         {
1472             return;
1473         }
1474 
1475         switch (Subtable->Type)
1476         {
1477         case ACPI_FPDT_TYPE_BOOT:
1478 
1479             InfoTable = AcpiDmTableInfoFpdt0;
1480             break;
1481 
1482         case ACPI_FPDT_TYPE_S3PERF:
1483 
1484             InfoTable = AcpiDmTableInfoFpdt1;
1485             break;
1486 
1487         default:
1488 
1489             AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
1490                 Subtable->Type);
1491 
1492             /* Attempt to continue */
1493 
1494             if (!Subtable->Length)
1495             {
1496                 AcpiOsPrintf ("Invalid zero length subtable\n");
1497                 return;
1498             }
1499             goto NextSubtable;
1500         }
1501 
1502         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1503             Subtable->Length, InfoTable);
1504         if (ACPI_FAILURE (Status))
1505         {
1506             return;
1507         }
1508 
1509 NextSubtable:
1510         /* Point to next subtable */
1511 
1512         Offset += Subtable->Length;
1513         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
1514             Subtable->Length);
1515     }
1516 }
1517 
1518 
1519 /*******************************************************************************
1520  *
1521  * FUNCTION:    AcpiDmDumpGtdt
1522  *
1523  * PARAMETERS:  Table               - A GTDT table
1524  *
1525  * RETURN:      None
1526  *
1527  * DESCRIPTION: Format the contents of a GTDT. This table type consists
1528  *              of an open-ended number of subtables.
1529  *
1530  ******************************************************************************/
1531 
1532 void
1533 AcpiDmDumpGtdt (
1534     ACPI_TABLE_HEADER       *Table)
1535 {
1536     ACPI_STATUS             Status;
1537     ACPI_GTDT_HEADER        *Subtable;
1538     UINT32                  Length = Table->Length;
1539     UINT32                  Offset = sizeof (ACPI_TABLE_GTDT);
1540     ACPI_DMTABLE_INFO       *InfoTable;
1541     UINT32                  SubtableLength;
1542     UINT32                  GtCount;
1543     ACPI_GTDT_TIMER_ENTRY   *GtxTable;
1544 
1545 
1546     /* Main table */
1547 
1548     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1549     if (ACPI_FAILURE (Status))
1550     {
1551         return;
1552     }
1553 
1554     /* Subtables */
1555 
1556     Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1557     while (Offset < Table->Length)
1558     {
1559         /* Common subtable header */
1560 
1561         AcpiOsPrintf ("\n");
1562         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1563             Subtable->Length, AcpiDmTableInfoGtdtHdr);
1564         if (ACPI_FAILURE (Status))
1565         {
1566             return;
1567         }
1568 
1569         GtCount = 0;
1570         switch (Subtable->Type)
1571         {
1572         case ACPI_GTDT_TYPE_TIMER_BLOCK:
1573 
1574             SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1575             GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1576                 Subtable))->TimerCount;
1577 
1578             InfoTable = AcpiDmTableInfoGtdt0;
1579             break;
1580 
1581         case ACPI_GTDT_TYPE_WATCHDOG:
1582 
1583             SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
1584 
1585             InfoTable = AcpiDmTableInfoGtdt1;
1586             break;
1587 
1588         default:
1589 
1590             /* Cannot continue on unknown type - no length */
1591 
1592             AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1593                 Subtable->Type);
1594             return;
1595         }
1596 
1597         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1598             Subtable->Length, InfoTable);
1599         if (ACPI_FAILURE (Status))
1600         {
1601             return;
1602         }
1603 
1604         /* Point to end of current subtable (each subtable above is of fixed length) */
1605 
1606         Offset += SubtableLength;
1607 
1608         /* If there are any Gt Timer Blocks from above, dump them now */
1609 
1610         if (GtCount)
1611         {
1612             GtxTable = ACPI_ADD_PTR (
1613                 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
1614             SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1615 
1616             while (GtCount)
1617             {
1618                 AcpiOsPrintf ("\n");
1619                 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1620                     sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1621                 if (ACPI_FAILURE (Status))
1622                 {
1623                     return;
1624                 }
1625                 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1626                 GtxTable++;
1627                 GtCount--;
1628             }
1629         }
1630 
1631         /* Point to next subtable */
1632 
1633         Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
1634     }
1635 }
1636 
1637 
1638 /*******************************************************************************
1639  *
1640  * FUNCTION:    AcpiDmDumpHest
1641  *
1642  * PARAMETERS:  Table               - A HEST table
1643  *
1644  * RETURN:      None
1645  *
1646  * DESCRIPTION: Format the contents of a HEST. This table type consists
1647  *              of an open-ended number of subtables.
1648  *
1649  ******************************************************************************/
1650 
1651 void
1652 AcpiDmDumpHest (
1653     ACPI_TABLE_HEADER       *Table)
1654 {
1655     ACPI_STATUS             Status;
1656     ACPI_HEST_HEADER        *Subtable;
1657     UINT32                  Length = Table->Length;
1658     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
1659     ACPI_DMTABLE_INFO       *InfoTable;
1660     UINT32                  SubtableLength;
1661     UINT32                  BankCount;
1662     ACPI_HEST_IA_ERROR_BANK *BankTable;
1663 
1664 
1665     /* Main table */
1666 
1667     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1668     if (ACPI_FAILURE (Status))
1669     {
1670         return;
1671     }
1672 
1673     /* Subtables */
1674 
1675     Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1676     while (Offset < Table->Length)
1677     {
1678         BankCount = 0;
1679         switch (Subtable->Type)
1680         {
1681         case ACPI_HEST_TYPE_IA32_CHECK:
1682 
1683             InfoTable = AcpiDmTableInfoHest0;
1684             SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1685             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1686                 Subtable))->NumHardwareBanks;
1687             break;
1688 
1689         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1690 
1691             InfoTable = AcpiDmTableInfoHest1;
1692             SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1693             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1694                 Subtable))->NumHardwareBanks;
1695             break;
1696 
1697         case ACPI_HEST_TYPE_IA32_NMI:
1698 
1699             InfoTable = AcpiDmTableInfoHest2;
1700             SubtableLength = sizeof (ACPI_HEST_IA_NMI);
1701             break;
1702 
1703         case ACPI_HEST_TYPE_AER_ROOT_PORT:
1704 
1705             InfoTable = AcpiDmTableInfoHest6;
1706             SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
1707             break;
1708 
1709         case ACPI_HEST_TYPE_AER_ENDPOINT:
1710 
1711             InfoTable = AcpiDmTableInfoHest7;
1712             SubtableLength = sizeof (ACPI_HEST_AER);
1713             break;
1714 
1715         case ACPI_HEST_TYPE_AER_BRIDGE:
1716 
1717             InfoTable = AcpiDmTableInfoHest8;
1718             SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1719             break;
1720 
1721         case ACPI_HEST_TYPE_GENERIC_ERROR:
1722 
1723             InfoTable = AcpiDmTableInfoHest9;
1724             SubtableLength = sizeof (ACPI_HEST_GENERIC);
1725             break;
1726 
1727         case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1728 
1729             InfoTable = AcpiDmTableInfoHest10;
1730             SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
1731             break;
1732 
1733         case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
1734 
1735             InfoTable = AcpiDmTableInfoHest11;
1736             SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
1737             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
1738                 Subtable))->NumHardwareBanks;
1739             break;
1740 
1741         default:
1742 
1743             /* Cannot continue on unknown type - no length */
1744 
1745             AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1746                 Subtable->Type);
1747             return;
1748         }
1749 
1750         AcpiOsPrintf ("\n");
1751         Status = AcpiDmDumpTable (Length, Offset, Subtable,
1752             SubtableLength, InfoTable);
1753         if (ACPI_FAILURE (Status))
1754         {
1755             return;
1756         }
1757 
1758         /* Point to end of current subtable (each subtable above is of fixed length) */
1759 
1760         Offset += SubtableLength;
1761 
1762         /* If there are any (fixed-length) Error Banks from above, dump them now */
1763 
1764         if (BankCount)
1765         {
1766             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
1767                 SubtableLength);
1768             SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1769 
1770             while (BankCount)
1771             {
1772                 AcpiOsPrintf ("\n");
1773                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1774                     sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1775                 if (ACPI_FAILURE (Status))
1776                 {
1777                     return;
1778                 }
1779 
1780                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1781                 BankTable++;
1782                 BankCount--;
1783             }
1784         }
1785 
1786         /* Point to next subtable */
1787 
1788         Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
1789     }
1790 }
1791 
1792 
1793 /*******************************************************************************
1794  *
1795  * FUNCTION:    AcpiDmDumpHmat
1796  *
1797  * PARAMETERS:  Table               - A HMAT table
1798  *
1799  * RETURN:      None
1800  *
1801  * DESCRIPTION: Format the contents of a HMAT.
1802  *
1803  ******************************************************************************/
1804 
1805 void
1806 AcpiDmDumpHmat (
1807     ACPI_TABLE_HEADER       *Table)
1808 {
1809     ACPI_STATUS             Status;
1810     ACPI_HMAT_STRUCTURE     *HmatStruct;
1811     ACPI_HMAT_LOCALITY      *HmatLocality;
1812     ACPI_HMAT_CACHE         *HmatCache;
1813     UINT32                  Offset;
1814     UINT32                  SubtableOffset;
1815     UINT32                  Length;
1816     ACPI_DMTABLE_INFO       *InfoTable;
1817     UINT32                  i, j;
1818 
1819 
1820     /* Main table */
1821 
1822     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
1823     if (ACPI_FAILURE (Status))
1824     {
1825         return;
1826     }
1827     Offset = sizeof (ACPI_TABLE_HMAT);
1828 
1829     while (Offset < Table->Length)
1830     {
1831         AcpiOsPrintf ("\n");
1832         SubtableOffset = 0;
1833 
1834         /* Dump HMAT structure header */
1835 
1836         HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
1837         if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
1838         {
1839             AcpiOsPrintf ("Invalid HMAT structure length\n");
1840             return;
1841         }
1842         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1843             HmatStruct->Length, AcpiDmTableInfoHmatHdr);
1844         if (ACPI_FAILURE (Status))
1845         {
1846             return;
1847         }
1848 
1849         switch (HmatStruct->Type)
1850         {
1851         case ACPI_HMAT_TYPE_ADDRESS_RANGE:
1852 
1853             InfoTable = AcpiDmTableInfoHmat0;
1854             Length = sizeof (ACPI_HMAT_ADDRESS_RANGE);
1855             break;
1856 
1857         case ACPI_HMAT_TYPE_LOCALITY:
1858 
1859             InfoTable = AcpiDmTableInfoHmat1;
1860             Length = sizeof (ACPI_HMAT_LOCALITY);
1861             break;
1862 
1863         case ACPI_HMAT_TYPE_CACHE:
1864 
1865             InfoTable = AcpiDmTableInfoHmat2;
1866             Length = sizeof (ACPI_HMAT_CACHE);
1867             break;
1868 
1869         default:
1870 
1871             AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
1872                 HmatStruct->Type);
1873 
1874             /* Attempt to continue */
1875 
1876             goto NextSubtable;
1877         }
1878 
1879         /* Dump HMAT structure body */
1880 
1881         if (HmatStruct->Length < Length)
1882         {
1883             AcpiOsPrintf ("Invalid HMAT structure length\n");
1884             return;
1885         }
1886         Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1887             HmatStruct->Length, InfoTable);
1888         if (ACPI_FAILURE (Status))
1889         {
1890             return;
1891         }
1892 
1893         /* Dump HMAT structure additionals */
1894 
1895         switch (HmatStruct->Type)
1896         {
1897         case ACPI_HMAT_TYPE_LOCALITY:
1898 
1899             HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
1900             SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
1901 
1902             /* Dump initiator proximity domains */
1903 
1904             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1905                 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
1906             {
1907                 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
1908                 return;
1909             }
1910             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1911             {
1912                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1913                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1914                     4, AcpiDmTableInfoHmat1a);
1915                 SubtableOffset += 4;
1916             }
1917 
1918             /* Dump target proximity domains */
1919 
1920             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1921                 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
1922             {
1923                 AcpiOsPrintf ("Invalid target proximity domain number\n");
1924                 return;
1925             }
1926             for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
1927             {
1928                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1929                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1930                     4, AcpiDmTableInfoHmat1b);
1931                 SubtableOffset += 4;
1932             }
1933 
1934             /* Dump latency/bandwidth entris */
1935 
1936             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1937                 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
1938                          HmatLocality->NumberOfTargetPDs * 2))
1939             {
1940                 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
1941                 return;
1942             }
1943             for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1944             {
1945                 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
1946                 {
1947                     Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1948                         ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1949                         2, AcpiDmTableInfoHmat1c);
1950                     SubtableOffset += 2;
1951                 }
1952             }
1953             break;
1954 
1955         case ACPI_HMAT_TYPE_CACHE:
1956 
1957             HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
1958             SubtableOffset = sizeof (ACPI_HMAT_CACHE);
1959 
1960             /* Dump SMBIOS handles */
1961 
1962             if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1963                 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
1964             {
1965                 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
1966                 return;
1967             }
1968             for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
1969             {
1970                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1971                     ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1972                     2, AcpiDmTableInfoHmat2a);
1973                 SubtableOffset += 2;
1974             }
1975             break;
1976 
1977         default:
1978 
1979             break;
1980         }
1981 
1982 NextSubtable:
1983         /* Point to next HMAT structure subtable */
1984 
1985         Offset += (HmatStruct->Length);
1986     }
1987 }
1988 
1989 
1990 /*******************************************************************************
1991  *
1992  * FUNCTION:    AcpiDmDumpIort
1993  *
1994  * PARAMETERS:  Table               - A IORT table
1995  *
1996  * RETURN:      None
1997  *
1998  * DESCRIPTION: Format the contents of a IORT
1999  *
2000  ******************************************************************************/
2001 
2002 void
2003 AcpiDmDumpIort (
2004     ACPI_TABLE_HEADER       *Table)
2005 {
2006     ACPI_STATUS             Status;
2007     ACPI_TABLE_IORT         *Iort;
2008     ACPI_IORT_NODE          *IortNode;
2009     ACPI_IORT_ITS_GROUP     *IortItsGroup = NULL;
2010     ACPI_IORT_SMMU          *IortSmmu = NULL;
2011     UINT32                  Offset;
2012     UINT32                  NodeOffset;
2013     UINT32                  Length;
2014     ACPI_DMTABLE_INFO       *InfoTable;
2015     char                    *String;
2016     UINT32                  i;
2017 
2018 
2019     /* Main table */
2020 
2021     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
2022     if (ACPI_FAILURE (Status))
2023     {
2024         return;
2025     }
2026 
2027     Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
2028     Offset = sizeof (ACPI_TABLE_IORT);
2029 
2030     /* Dump the OptionalPadding (optional) */
2031 
2032     if (Iort->NodeOffset > Offset)
2033     {
2034         Status = AcpiDmDumpTable (Table->Length, Offset, Table,
2035             Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
2036         if (ACPI_FAILURE (Status))
2037         {
2038             return;
2039         }
2040     }
2041 
2042     Offset = Iort->NodeOffset;
2043     while (Offset < Table->Length)
2044     {
2045         /* Common subtable header */
2046 
2047         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
2048         AcpiOsPrintf ("\n");
2049         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
2050         Status = AcpiDmDumpTable (Table->Length, Offset,
2051             IortNode, Length, AcpiDmTableInfoIortHdr);
2052         if (ACPI_FAILURE (Status))
2053         {
2054             return;
2055         }
2056 
2057         NodeOffset = Length;
2058 
2059         switch (IortNode->Type)
2060         {
2061         case ACPI_IORT_NODE_ITS_GROUP:
2062 
2063             InfoTable = AcpiDmTableInfoIort0;
2064             Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
2065             IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
2066             break;
2067 
2068         case ACPI_IORT_NODE_NAMED_COMPONENT:
2069 
2070             InfoTable = AcpiDmTableInfoIort1;
2071             Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
2072             String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
2073             Length += strlen (String) + 1;
2074             break;
2075 
2076         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
2077 
2078             InfoTable = AcpiDmTableInfoIort2;
2079             Length = IortNode->Length - NodeOffset;
2080             break;
2081 
2082         case ACPI_IORT_NODE_SMMU:
2083 
2084             InfoTable = AcpiDmTableInfoIort3;
2085             Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
2086             IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
2087             break;
2088 
2089         case ACPI_IORT_NODE_SMMU_V3:
2090 
2091             InfoTable = AcpiDmTableInfoIort4;
2092             Length = IortNode->Length - NodeOffset;
2093             break;
2094 
2095         default:
2096 
2097             AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
2098                 IortNode->Type);
2099 
2100             /* Attempt to continue */
2101 
2102             if (!IortNode->Length)
2103             {
2104                 AcpiOsPrintf ("Invalid zero length IORT node\n");
2105                 return;
2106             }
2107             goto NextSubtable;
2108         }
2109 
2110         /* Dump the node subtable header */
2111 
2112         AcpiOsPrintf ("\n");
2113         Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2114             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2115             Length, InfoTable);
2116         if (ACPI_FAILURE (Status))
2117         {
2118             return;
2119         }
2120 
2121         NodeOffset += Length;
2122 
2123         /* Dump the node specific data */
2124 
2125         switch (IortNode->Type)
2126         {
2127         case ACPI_IORT_NODE_ITS_GROUP:
2128 
2129             /* Validate IortItsGroup to avoid compiler warnings */
2130 
2131             if (IortItsGroup)
2132             {
2133                 for (i = 0; i < IortItsGroup->ItsCount; i++)
2134                 {
2135                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2136                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2137                         4, AcpiDmTableInfoIort0a);
2138                     NodeOffset += 4;
2139                 }
2140             }
2141             break;
2142 
2143         case ACPI_IORT_NODE_NAMED_COMPONENT:
2144 
2145             /* Dump the Padding (optional) */
2146 
2147             if (IortNode->Length > NodeOffset)
2148             {
2149                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2150                     Table, IortNode->Length - NodeOffset,
2151                     AcpiDmTableInfoIort1a);
2152                 if (ACPI_FAILURE (Status))
2153                 {
2154                     return;
2155                 }
2156             }
2157             break;
2158 
2159         case ACPI_IORT_NODE_SMMU:
2160 
2161             AcpiOsPrintf ("\n");
2162 
2163             /* Validate IortSmmu to avoid compiler warnings */
2164 
2165             if (IortSmmu)
2166             {
2167                 Length = 2 * sizeof (UINT64);
2168                 NodeOffset = IortSmmu->GlobalInterruptOffset;
2169                 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2170                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2171                     Length, AcpiDmTableInfoIort3a);
2172                 if (ACPI_FAILURE (Status))
2173                 {
2174                     return;
2175                 }
2176 
2177                 NodeOffset = IortSmmu->ContextInterruptOffset;
2178                 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
2179                 {
2180                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2181                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2182                         8, AcpiDmTableInfoIort3b);
2183                     if (ACPI_FAILURE (Status))
2184                     {
2185                         return;
2186                     }
2187 
2188                     NodeOffset += 8;
2189                 }
2190 
2191                 NodeOffset = IortSmmu->PmuInterruptOffset;
2192                 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
2193                 {
2194                     Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2195                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2196                         8, AcpiDmTableInfoIort3c);
2197                     if (ACPI_FAILURE (Status))
2198                     {
2199                         return;
2200                     }
2201 
2202                     NodeOffset += 8;
2203                 }
2204             }
2205             break;
2206 
2207         default:
2208 
2209             break;
2210         }
2211 
2212         /* Dump the ID mappings */
2213 
2214         NodeOffset = IortNode->MappingOffset;
2215         for (i = 0; i < IortNode->MappingCount; i++)
2216         {
2217             AcpiOsPrintf ("\n");
2218             Length = sizeof (ACPI_IORT_ID_MAPPING);
2219             Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
2220                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
2221                 Length, AcpiDmTableInfoIortMap);
2222             if (ACPI_FAILURE (Status))
2223             {
2224                 return;
2225             }
2226 
2227             NodeOffset += Length;
2228         }
2229 
2230 NextSubtable:
2231         /* Point to next node subtable */
2232 
2233         Offset += IortNode->Length;
2234         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
2235     }
2236 }
2237 
2238 
2239 /*******************************************************************************
2240  *
2241  * FUNCTION:    AcpiDmDumpIvrs
2242  *
2243  * PARAMETERS:  Table               - A IVRS table
2244  *
2245  * RETURN:      None
2246  *
2247  * DESCRIPTION: Format the contents of a IVRS
2248  *
2249  ******************************************************************************/
2250 
2251 static UINT8 EntrySizes[] = {4,8,16,32};
2252 
2253 void
2254 AcpiDmDumpIvrs (
2255     ACPI_TABLE_HEADER       *Table)
2256 {
2257     ACPI_STATUS             Status;
2258     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
2259     UINT32                  EntryOffset;
2260     UINT32                  EntryLength;
2261     UINT32                  EntryType;
2262     ACPI_IVRS_DE_HEADER     *DeviceEntry;
2263     ACPI_IVRS_HEADER        *Subtable;
2264     ACPI_DMTABLE_INFO       *InfoTable;
2265 
2266 
2267     /* Main table */
2268 
2269     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
2270     if (ACPI_FAILURE (Status))
2271     {
2272         return;
2273     }
2274 
2275     /* Subtables */
2276 
2277     Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
2278     while (Offset < Table->Length)
2279     {
2280         /* Common subtable header */
2281 
2282         AcpiOsPrintf ("\n");
2283         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2284             Subtable->Length, AcpiDmTableInfoIvrsHdr);
2285         if (ACPI_FAILURE (Status))
2286         {
2287             return;
2288         }
2289 
2290         switch (Subtable->Type)
2291         {
2292         case ACPI_IVRS_TYPE_HARDWARE:
2293 
2294             InfoTable = AcpiDmTableInfoIvrs0;
2295             break;
2296 
2297         case ACPI_IVRS_TYPE_MEMORY1:
2298         case ACPI_IVRS_TYPE_MEMORY2:
2299         case ACPI_IVRS_TYPE_MEMORY3:
2300 
2301             InfoTable = AcpiDmTableInfoIvrs1;
2302             break;
2303 
2304         default:
2305 
2306             AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
2307                 Subtable->Type);
2308 
2309             /* Attempt to continue */
2310 
2311             if (!Subtable->Length)
2312             {
2313                 AcpiOsPrintf ("Invalid zero length subtable\n");
2314                 return;
2315             }
2316             goto NextSubtable;
2317         }
2318 
2319         /* Dump the subtable */
2320 
2321         AcpiOsPrintf ("\n");
2322         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2323             Subtable->Length, InfoTable);
2324         if (ACPI_FAILURE (Status))
2325         {
2326             return;
2327         }
2328 
2329         /* The hardware subtable can contain multiple device entries */
2330 
2331         if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE)
2332         {
2333             EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
2334             DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
2335                 sizeof (ACPI_IVRS_HARDWARE));
2336 
2337             while (EntryOffset < (Offset + Subtable->Length))
2338             {
2339                 AcpiOsPrintf ("\n");
2340                 /*
2341                  * Upper 2 bits of Type encode the length of the device entry
2342                  *
2343                  * 00 = 4 byte
2344                  * 01 = 8 byte
2345                  * 10 = 16 byte - currently no entries defined
2346                  * 11 = 32 byte - currently no entries defined
2347                  */
2348                 EntryType = DeviceEntry->Type;
2349                 EntryLength = EntrySizes [EntryType >> 6];
2350 
2351                 switch (EntryType)
2352                 {
2353                 /* 4-byte device entries */
2354 
2355                 case ACPI_IVRS_TYPE_PAD4:
2356                 case ACPI_IVRS_TYPE_ALL:
2357                 case ACPI_IVRS_TYPE_SELECT:
2358                 case ACPI_IVRS_TYPE_START:
2359                 case ACPI_IVRS_TYPE_END:
2360 
2361                     InfoTable = AcpiDmTableInfoIvrs4;
2362                     break;
2363 
2364                 /* 8-byte entries, type A */
2365 
2366                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
2367                 case ACPI_IVRS_TYPE_ALIAS_START:
2368 
2369                     InfoTable = AcpiDmTableInfoIvrs8a;
2370                     break;
2371 
2372                 /* 8-byte entries, type B */
2373 
2374                 case ACPI_IVRS_TYPE_PAD8:
2375                 case ACPI_IVRS_TYPE_EXT_SELECT:
2376                 case ACPI_IVRS_TYPE_EXT_START:
2377 
2378                     InfoTable = AcpiDmTableInfoIvrs8b;
2379                     break;
2380 
2381                 /* 8-byte entries, type C */
2382 
2383                 case ACPI_IVRS_TYPE_SPECIAL:
2384 
2385                     InfoTable = AcpiDmTableInfoIvrs8c;
2386                     break;
2387 
2388                 default:
2389                     InfoTable = AcpiDmTableInfoIvrs4;
2390                     AcpiOsPrintf (
2391                         "\n**** Unknown IVRS device entry type/length: "
2392                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
2393                         EntryType, EntryLength, EntryOffset);
2394                     break;
2395                 }
2396 
2397                 /* Dump the Device Entry */
2398 
2399                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
2400                     DeviceEntry, EntryLength, InfoTable);
2401                 if (ACPI_FAILURE (Status))
2402                 {
2403                     return;
2404                 }
2405 
2406                 EntryOffset += EntryLength;
2407                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
2408                     EntryLength);
2409             }
2410         }
2411 
2412 NextSubtable:
2413         /* Point to next subtable */
2414 
2415         Offset += Subtable->Length;
2416         Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
2417     }
2418 }
2419 
2420 
2421 /*******************************************************************************
2422  *
2423  * FUNCTION:    AcpiDmDumpLpit
2424  *
2425  * PARAMETERS:  Table               - A LPIT table
2426  *
2427  * RETURN:      None
2428  *
2429  * DESCRIPTION: Format the contents of a LPIT. This table type consists
2430  *              of an open-ended number of subtables. Note: There are no
2431  *              entries in the main table. An LPIT consists of the table
2432  *              header and then subtables only.
2433  *
2434  ******************************************************************************/
2435 
2436 void
2437 AcpiDmDumpLpit (
2438     ACPI_TABLE_HEADER       *Table)
2439 {
2440     ACPI_STATUS             Status;
2441     ACPI_LPIT_HEADER        *Subtable;
2442     UINT32                  Length = Table->Length;
2443     UINT32                  Offset = sizeof (ACPI_TABLE_LPIT);
2444     ACPI_DMTABLE_INFO       *InfoTable;
2445     UINT32                  SubtableLength;
2446 
2447 
2448     /* Subtables */
2449 
2450     Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
2451     while (Offset < Table->Length)
2452     {
2453         /* Common subtable header */
2454 
2455         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2456             sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
2457         if (ACPI_FAILURE (Status))
2458         {
2459             return;
2460         }
2461 
2462         switch (Subtable->Type)
2463         {
2464         case ACPI_LPIT_TYPE_NATIVE_CSTATE:
2465 
2466             InfoTable = AcpiDmTableInfoLpit0;
2467             SubtableLength = sizeof (ACPI_LPIT_NATIVE);
2468             break;
2469 
2470         default:
2471 
2472             /* Cannot continue on unknown type - no length */
2473 
2474             AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n",
2475                 Subtable->Type);
2476             return;
2477         }
2478 
2479         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2480             SubtableLength, InfoTable);
2481         if (ACPI_FAILURE (Status))
2482         {
2483             return;
2484         }
2485 
2486         AcpiOsPrintf ("\n");
2487 
2488         /* Point to next subtable */
2489 
2490         Offset += SubtableLength;
2491         Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength);
2492     }
2493 }
2494 
2495 
2496 /*******************************************************************************
2497  *
2498  * FUNCTION:    AcpiDmDumpMadt
2499  *
2500  * PARAMETERS:  Table               - A MADT table
2501  *
2502  * RETURN:      None
2503  *
2504  * DESCRIPTION: Format the contents of a MADT. This table type consists
2505  *              of an open-ended number of subtables.
2506  *
2507  ******************************************************************************/
2508 
2509 void
2510 AcpiDmDumpMadt (
2511     ACPI_TABLE_HEADER       *Table)
2512 {
2513     ACPI_STATUS             Status;
2514     ACPI_SUBTABLE_HEADER    *Subtable;
2515     UINT32                  Length = Table->Length;
2516     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
2517     ACPI_DMTABLE_INFO       *InfoTable;
2518 
2519 
2520     /* Main table */
2521 
2522     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
2523     if (ACPI_FAILURE (Status))
2524     {
2525         return;
2526     }
2527 
2528     /* Subtables */
2529 
2530     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2531     while (Offset < Table->Length)
2532     {
2533         /* Common subtable header */
2534 
2535         AcpiOsPrintf ("\n");
2536         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2537             Subtable->Length, AcpiDmTableInfoMadtHdr);
2538         if (ACPI_FAILURE (Status))
2539         {
2540             return;
2541         }
2542 
2543         switch (Subtable->Type)
2544         {
2545         case ACPI_MADT_TYPE_LOCAL_APIC:
2546 
2547             InfoTable = AcpiDmTableInfoMadt0;
2548             break;
2549 
2550         case ACPI_MADT_TYPE_IO_APIC:
2551 
2552             InfoTable = AcpiDmTableInfoMadt1;
2553             break;
2554 
2555         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
2556 
2557             InfoTable = AcpiDmTableInfoMadt2;
2558             break;
2559 
2560         case ACPI_MADT_TYPE_NMI_SOURCE:
2561 
2562             InfoTable = AcpiDmTableInfoMadt3;
2563             break;
2564 
2565         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
2566 
2567             InfoTable = AcpiDmTableInfoMadt4;
2568             break;
2569 
2570         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
2571 
2572             InfoTable = AcpiDmTableInfoMadt5;
2573             break;
2574 
2575         case ACPI_MADT_TYPE_IO_SAPIC:
2576 
2577             InfoTable = AcpiDmTableInfoMadt6;
2578             break;
2579 
2580         case ACPI_MADT_TYPE_LOCAL_SAPIC:
2581 
2582             InfoTable = AcpiDmTableInfoMadt7;
2583             break;
2584 
2585         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
2586 
2587             InfoTable = AcpiDmTableInfoMadt8;
2588             break;
2589 
2590         case ACPI_MADT_TYPE_LOCAL_X2APIC:
2591 
2592             InfoTable = AcpiDmTableInfoMadt9;
2593             break;
2594 
2595         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
2596 
2597             InfoTable = AcpiDmTableInfoMadt10;
2598             break;
2599 
2600         case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
2601 
2602             InfoTable = AcpiDmTableInfoMadt11;
2603             break;
2604 
2605         case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
2606 
2607             InfoTable = AcpiDmTableInfoMadt12;
2608             break;
2609 
2610         case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2611 
2612             InfoTable = AcpiDmTableInfoMadt13;
2613             break;
2614 
2615         case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2616 
2617             InfoTable = AcpiDmTableInfoMadt14;
2618             break;
2619 
2620         case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2621 
2622             InfoTable = AcpiDmTableInfoMadt15;
2623             break;
2624 
2625         default:
2626 
2627             AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n",
2628                 Subtable->Type);
2629 
2630             /* Attempt to continue */
2631 
2632             if (!Subtable->Length)
2633             {
2634                 AcpiOsPrintf ("Invalid zero length subtable\n");
2635                 return;
2636             }
2637 
2638             goto NextSubtable;
2639         }
2640 
2641         Status = AcpiDmDumpTable (Length, Offset, Subtable,
2642             Subtable->Length, InfoTable);
2643         if (ACPI_FAILURE (Status))
2644         {
2645             return;
2646         }
2647 
2648 NextSubtable:
2649         /* Point to next subtable */
2650 
2651         Offset += Subtable->Length;
2652         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
2653             Subtable->Length);
2654     }
2655 }
2656 
2657 
2658 /*******************************************************************************
2659  *
2660  * FUNCTION:    AcpiDmDumpMcfg
2661  *
2662  * PARAMETERS:  Table               - A MCFG Table
2663  *
2664  * RETURN:      None
2665  *
2666  * DESCRIPTION: Format the contents of a MCFG table
2667  *
2668  ******************************************************************************/
2669 
2670 void
2671 AcpiDmDumpMcfg (
2672     ACPI_TABLE_HEADER       *Table)
2673 {
2674     ACPI_STATUS             Status;
2675     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
2676     ACPI_MCFG_ALLOCATION    *Subtable;
2677 
2678 
2679     /* Main table */
2680 
2681     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
2682     if (ACPI_FAILURE (Status))
2683     {
2684         return;
2685     }
2686 
2687     /* Subtables */
2688 
2689     Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
2690     while (Offset < Table->Length)
2691     {
2692         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
2693         {
2694             AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
2695                 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
2696             return;
2697         }
2698 
2699         AcpiOsPrintf ("\n");
2700         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2701             sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
2702         if (ACPI_FAILURE (Status))
2703         {
2704             return;
2705         }
2706 
2707         /* Point to next subtable (each subtable is of fixed length) */
2708 
2709         Offset += sizeof (ACPI_MCFG_ALLOCATION);
2710         Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable,
2711             sizeof (ACPI_MCFG_ALLOCATION));
2712     }
2713 }
2714 
2715 
2716 /*******************************************************************************
2717  *
2718  * FUNCTION:    AcpiDmDumpMpst
2719  *
2720  * PARAMETERS:  Table               - A MPST Table
2721  *
2722  * RETURN:      None
2723  *
2724  * DESCRIPTION: Format the contents of a MPST table
2725  *
2726  ******************************************************************************/
2727 
2728 void
2729 AcpiDmDumpMpst (
2730     ACPI_TABLE_HEADER       *Table)
2731 {
2732     ACPI_STATUS             Status;
2733     UINT32                  Offset = sizeof (ACPI_TABLE_MPST);
2734     ACPI_MPST_POWER_NODE    *Subtable0;
2735     ACPI_MPST_POWER_STATE   *Subtable0A;
2736     ACPI_MPST_COMPONENT     *Subtable0B;
2737     ACPI_MPST_DATA_HDR      *Subtable1;
2738     ACPI_MPST_POWER_DATA    *Subtable2;
2739     UINT16                  SubtableCount;
2740     UINT32                  PowerStateCount;
2741     UINT32                  ComponentCount;
2742 
2743 
2744     /* Main table */
2745 
2746     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
2747     if (ACPI_FAILURE (Status))
2748     {
2749         return;
2750     }
2751 
2752     /* Subtable: Memory Power Node(s) */
2753 
2754     SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
2755     Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
2756 
2757     while ((Offset < Table->Length) && SubtableCount)
2758     {
2759         AcpiOsPrintf ("\n");
2760         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
2761             sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
2762         if (ACPI_FAILURE (Status))
2763         {
2764             return;
2765         }
2766 
2767         /* Extract the sub-subtable counts */
2768 
2769         PowerStateCount = Subtable0->NumPowerStates;
2770         ComponentCount = Subtable0->NumPhysicalComponents;
2771         Offset += sizeof (ACPI_MPST_POWER_NODE);
2772 
2773         /* Sub-subtables - Memory Power State Structure(s) */
2774 
2775         Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0,
2776             sizeof (ACPI_MPST_POWER_NODE));
2777 
2778         while (PowerStateCount)
2779         {
2780             AcpiOsPrintf ("\n");
2781             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
2782                 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
2783             if (ACPI_FAILURE (Status))
2784             {
2785                 return;
2786             }
2787 
2788             Subtable0A++;
2789             PowerStateCount--;
2790             Offset += sizeof (ACPI_MPST_POWER_STATE);
2791        }
2792 
2793         /* Sub-subtables - Physical Component ID Structure(s) */
2794 
2795         Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A);
2796 
2797         if (ComponentCount)
2798         {
2799             AcpiOsPrintf ("\n");
2800         }
2801 
2802         while (ComponentCount)
2803         {
2804             Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
2805                 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
2806             if (ACPI_FAILURE (Status))
2807             {
2808                 return;
2809             }
2810 
2811             Subtable0B++;
2812             ComponentCount--;
2813             Offset += sizeof (ACPI_MPST_COMPONENT);
2814         }
2815 
2816         /* Point to next Memory Power Node subtable */
2817 
2818         SubtableCount--;
2819         Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
2820             sizeof (ACPI_MPST_POWER_NODE) +
2821             (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
2822             (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
2823     }
2824 
2825     /* Subtable: Count of Memory Power State Characteristic structures */
2826 
2827     AcpiOsPrintf ("\n");
2828     Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
2829     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
2830         sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
2831     if (ACPI_FAILURE (Status))
2832     {
2833         return;
2834     }
2835 
2836     SubtableCount = Subtable1->CharacteristicsCount;
2837     Offset += sizeof (ACPI_MPST_DATA_HDR);
2838 
2839     /* Subtable: Memory Power State Characteristics structure(s) */
2840 
2841     Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
2842         sizeof (ACPI_MPST_DATA_HDR));
2843 
2844     while ((Offset < Table->Length) && SubtableCount)
2845     {
2846         AcpiOsPrintf ("\n");
2847         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
2848             sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
2849         if (ACPI_FAILURE (Status))
2850         {
2851             return;
2852         }
2853 
2854         Subtable2++;
2855         SubtableCount--;
2856         Offset += sizeof (ACPI_MPST_POWER_DATA);
2857     }
2858 }
2859 
2860 
2861 /*******************************************************************************
2862  *
2863  * FUNCTION:    AcpiDmDumpMsct
2864  *
2865  * PARAMETERS:  Table               - A MSCT table
2866  *
2867  * RETURN:      None
2868  *
2869  * DESCRIPTION: Format the contents of a MSCT
2870  *
2871  ******************************************************************************/
2872 
2873 void
2874 AcpiDmDumpMsct (
2875     ACPI_TABLE_HEADER       *Table)
2876 {
2877     ACPI_STATUS             Status;
2878     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
2879     ACPI_MSCT_PROXIMITY     *Subtable;
2880 
2881 
2882     /* Main table */
2883 
2884     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
2885     if (ACPI_FAILURE (Status))
2886     {
2887         return;
2888     }
2889 
2890     /* Subtables */
2891 
2892     Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2893     while (Offset < Table->Length)
2894     {
2895         /* Common subtable header */
2896 
2897         AcpiOsPrintf ("\n");
2898         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2899             sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2900         if (ACPI_FAILURE (Status))
2901         {
2902             return;
2903         }
2904 
2905         /* Point to next subtable */
2906 
2907         Offset += sizeof (ACPI_MSCT_PROXIMITY);
2908         Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable,
2909             sizeof (ACPI_MSCT_PROXIMITY));
2910     }
2911 }
2912 
2913 
2914 /*******************************************************************************
2915  *
2916  * FUNCTION:    AcpiDmDumpMtmr
2917  *
2918  * PARAMETERS:  Table               - A MTMR table
2919  *
2920  * RETURN:      None
2921  *
2922  * DESCRIPTION: Format the contents of a MTMR
2923  *
2924  ******************************************************************************/
2925 
2926 void
2927 AcpiDmDumpMtmr (
2928     ACPI_TABLE_HEADER       *Table)
2929 {
2930     ACPI_STATUS             Status;
2931     UINT32                  Offset = sizeof (ACPI_TABLE_MTMR);
2932     ACPI_MTMR_ENTRY         *Subtable;
2933 
2934 
2935     /* Main table */
2936 
2937     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
2938     if (ACPI_FAILURE (Status))
2939     {
2940         return;
2941     }
2942 
2943     /* Subtables */
2944 
2945     Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2946     while (Offset < Table->Length)
2947     {
2948         /* Common subtable header */
2949 
2950         AcpiOsPrintf ("\n");
2951         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
2952             sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2953         if (ACPI_FAILURE (Status))
2954         {
2955             return;
2956         }
2957 
2958         /* Point to next subtable */
2959 
2960         Offset += sizeof (ACPI_MTMR_ENTRY);
2961         Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable,
2962             sizeof (ACPI_MTMR_ENTRY));
2963     }
2964 }
2965 
2966 
2967 /*******************************************************************************
2968  *
2969  * FUNCTION:    AcpiDmDumpNfit
2970  *
2971  * PARAMETERS:  Table               - A NFIT table
2972  *
2973  * RETURN:      None
2974  *
2975  * DESCRIPTION: Format the contents of an NFIT.
2976  *
2977  ******************************************************************************/
2978 
2979 void
2980 AcpiDmDumpNfit (
2981     ACPI_TABLE_HEADER       *Table)
2982 {
2983     ACPI_STATUS             Status;
2984     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
2985     UINT32                  FieldOffset = 0;
2986     UINT32                  Length;
2987     ACPI_NFIT_HEADER        *Subtable;
2988     ACPI_DMTABLE_INFO       *InfoTable;
2989     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
2990     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
2991     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2992     UINT32                  i;
2993 
2994 
2995     /* Main table */
2996 
2997     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
2998     if (ACPI_FAILURE (Status))
2999     {
3000         return;
3001     }
3002 
3003     /* Subtables */
3004 
3005     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
3006     while (Offset < Table->Length)
3007     {
3008         /* NFIT subtable header */
3009 
3010         AcpiOsPrintf ("\n");
3011         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3012             Subtable->Length, AcpiDmTableInfoNfitHdr);
3013         if (ACPI_FAILURE (Status))
3014         {
3015             return;
3016         }
3017 
3018         switch (Subtable->Type)
3019         {
3020         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
3021 
3022             InfoTable = AcpiDmTableInfoNfit0;
3023             break;
3024 
3025         case ACPI_NFIT_TYPE_MEMORY_MAP:
3026 
3027             InfoTable = AcpiDmTableInfoNfit1;
3028             break;
3029 
3030         case ACPI_NFIT_TYPE_INTERLEAVE:
3031 
3032             /* Has a variable number of 32-bit values at the end */
3033 
3034             InfoTable = AcpiDmTableInfoNfit2;
3035             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
3036             FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
3037             break;
3038 
3039         case ACPI_NFIT_TYPE_SMBIOS:
3040 
3041             SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable);
3042             InfoTable = AcpiDmTableInfoNfit3;
3043             break;
3044 
3045         case ACPI_NFIT_TYPE_CONTROL_REGION:
3046 
3047             InfoTable = AcpiDmTableInfoNfit4;
3048             break;
3049 
3050         case ACPI_NFIT_TYPE_DATA_REGION:
3051 
3052             InfoTable = AcpiDmTableInfoNfit5;
3053             break;
3054 
3055         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
3056 
3057             /* Has a variable number of 64-bit addresses at the end */
3058 
3059             InfoTable = AcpiDmTableInfoNfit6;
3060             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
3061             FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
3062             break;
3063 
3064         case ACPI_NFIT_TYPE_CAPABILITIES:    /* ACPI 6.0A */
3065 
3066             InfoTable = AcpiDmTableInfoNfit7;
3067             break;
3068 
3069         default:
3070             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
3071                 Subtable->Type);
3072 
3073             /* Attempt to continue */
3074 
3075             if (!Subtable->Length)
3076             {
3077                 AcpiOsPrintf ("Invalid zero length subtable\n");
3078                 return;
3079             }
3080             goto NextSubtable;
3081         }
3082 
3083         AcpiOsPrintf ("\n");
3084         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3085             Subtable->Length, InfoTable);
3086         if (ACPI_FAILURE (Status))
3087         {
3088             return;
3089         }
3090 
3091         /* Per-subtable variable-length fields */
3092 
3093         switch (Subtable->Type)
3094         {
3095         case ACPI_NFIT_TYPE_INTERLEAVE:
3096 
3097             for (i = 0; i < Interleave->LineCount; i++)
3098             {
3099                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
3100                     &Interleave->LineOffset[i],
3101                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
3102                 if (ACPI_FAILURE (Status))
3103                 {
3104                     return;
3105                 }
3106 
3107                 FieldOffset += sizeof (UINT32);
3108             }
3109             break;
3110 
3111         case ACPI_NFIT_TYPE_SMBIOS:
3112 
3113             Length = Subtable->Length -
3114                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
3115 
3116             if (Length)
3117             {
3118                 Status = AcpiDmDumpTable (Table->Length,
3119                     sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
3120                     SmbiosInfo,
3121                     Length, AcpiDmTableInfoNfit3a);
3122                 if (ACPI_FAILURE (Status))
3123                 {
3124                     return;
3125                 }
3126             }
3127 
3128             break;
3129 
3130         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
3131 
3132             for (i = 0; i < Hint->HintCount; i++)
3133             {
3134                 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
3135                     &Hint->HintAddress[i],
3136                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
3137                 if (ACPI_FAILURE (Status))
3138                 {
3139                     return;
3140                 }
3141 
3142                 FieldOffset += sizeof (UINT64);
3143             }
3144             break;
3145 
3146         default:
3147             break;
3148         }
3149 
3150 NextSubtable:
3151         /* Point to next subtable */
3152 
3153         Offset += Subtable->Length;
3154         Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
3155     }
3156 }
3157 
3158 
3159 /*******************************************************************************
3160  *
3161  * FUNCTION:    AcpiDmDumpPcct
3162  *
3163  * PARAMETERS:  Table               - A PCCT table
3164  *
3165  * RETURN:      None
3166  *
3167  * DESCRIPTION: Format the contents of a PCCT. This table type consists
3168  *              of an open-ended number of subtables.
3169  *
3170  ******************************************************************************/
3171 
3172 void
3173 AcpiDmDumpPcct (
3174     ACPI_TABLE_HEADER       *Table)
3175 {
3176     ACPI_STATUS             Status;
3177     ACPI_PCCT_SUBSPACE      *Subtable;
3178     ACPI_DMTABLE_INFO       *InfoTable;
3179     UINT32                  Length = Table->Length;
3180     UINT32                  Offset = sizeof (ACPI_TABLE_PCCT);
3181 
3182 
3183     /* Main table */
3184 
3185     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
3186     if (ACPI_FAILURE (Status))
3187     {
3188         return;
3189     }
3190 
3191     /* Subtables */
3192 
3193     Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
3194     while (Offset < Table->Length)
3195     {
3196         /* Common subtable header */
3197 
3198         AcpiOsPrintf ("\n");
3199         Status = AcpiDmDumpTable (Length, Offset, Subtable,
3200             Subtable->Header.Length, AcpiDmTableInfoPcctHdr);
3201         if (ACPI_FAILURE (Status))
3202         {
3203             return;
3204         }
3205 
3206         switch (Subtable->Header.Type)
3207         {
3208         case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
3209 
3210             InfoTable = AcpiDmTableInfoPcct0;
3211             break;
3212 
3213         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
3214 
3215             InfoTable = AcpiDmTableInfoPcct1;
3216             break;
3217 
3218         case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
3219 
3220             InfoTable = AcpiDmTableInfoPcct2;
3221             break;
3222 
3223         case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
3224 
3225             InfoTable = AcpiDmTableInfoPcct3;
3226             break;
3227 
3228         case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
3229 
3230             InfoTable = AcpiDmTableInfoPcct4;
3231             break;
3232 
3233         default:
3234 
3235             AcpiOsPrintf (
3236                 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
3237                 Subtable->Header.Type);
3238             return;
3239         }
3240 
3241         AcpiOsPrintf ("\n");
3242         Status = AcpiDmDumpTable (Length, Offset, Subtable,
3243             Subtable->Header.Length, InfoTable);
3244         if (ACPI_FAILURE (Status))
3245         {
3246             return;
3247         }
3248 
3249         /* Point to next subtable */
3250 
3251         Offset += Subtable->Header.Length;
3252         Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable,
3253             Subtable->Header.Length);
3254     }
3255 }
3256 
3257 
3258 /*******************************************************************************
3259  *
3260  * FUNCTION:    AcpiDmDumpPdtt
3261  *
3262  * PARAMETERS:  Table               - A PDTT table
3263  *
3264  * RETURN:      None
3265  *
3266  * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length
3267  *              table that contains an open-ended number of IDs
3268  *              at the end of the table.
3269  *
3270  ******************************************************************************/
3271 
3272 void
3273 AcpiDmDumpPdtt (
3274     ACPI_TABLE_HEADER       *Table)
3275 {
3276     ACPI_STATUS             Status;
3277     ACPI_PDTT_CHANNEL       *Subtable;
3278     UINT32                  Length = Table->Length;
3279     UINT32                  Offset = sizeof (ACPI_TABLE_PDTT);
3280 
3281 
3282     /* Main table */
3283 
3284     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt);
3285     if (ACPI_FAILURE (Status))
3286     {
3287         return;
3288     }
3289 
3290     /* Subtables. Currently there is only one type, but can be multiples */
3291 
3292     Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset);
3293     while (Offset < Table->Length)
3294     {
3295         AcpiOsPrintf ("\n");
3296         Status = AcpiDmDumpTable (Length, Offset, Subtable,
3297             sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0);
3298         if (ACPI_FAILURE (Status))
3299         {
3300             return;
3301         }
3302 
3303         /* Point to next subtable */
3304 
3305         Offset += sizeof (ACPI_PDTT_CHANNEL);
3306         Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable,
3307             sizeof (ACPI_PDTT_CHANNEL));
3308     }
3309 }
3310 
3311 
3312 /*******************************************************************************
3313  *
3314  * FUNCTION:    AcpiDmDumpPmtt
3315  *
3316  * PARAMETERS:  Table               - A PMTT table
3317  *
3318  * RETURN:      None
3319  *
3320  * DESCRIPTION: Format the contents of a PMTT. This table type consists
3321  *              of an open-ended number of subtables.
3322  *
3323  ******************************************************************************/
3324 
3325 void
3326 AcpiDmDumpPmtt (
3327     ACPI_TABLE_HEADER       *Table)
3328 {
3329     ACPI_STATUS             Status;
3330     ACPI_PMTT_HEADER        *Subtable;
3331     ACPI_PMTT_HEADER        *MemSubtable;
3332     ACPI_PMTT_HEADER        *DimmSubtable;
3333     ACPI_PMTT_DOMAIN        *DomainArray;
3334     UINT32                  Length = Table->Length;
3335     UINT32                  Offset = sizeof (ACPI_TABLE_PMTT);
3336     UINT32                  MemOffset;
3337     UINT32                  DimmOffset;
3338     UINT32                  DomainOffset;
3339     UINT32                  DomainCount;
3340 
3341 
3342     /* Main table */
3343 
3344     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
3345     if (ACPI_FAILURE (Status))
3346     {
3347         return;
3348     }
3349 
3350     /* Subtables */
3351 
3352     Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
3353     while (Offset < Table->Length)
3354     {
3355         /* Common subtable header */
3356 
3357         AcpiOsPrintf ("\n");
3358         Status = AcpiDmDumpTable (Length, Offset, Subtable,
3359             Subtable->Length, AcpiDmTableInfoPmttHdr);
3360         if (ACPI_FAILURE (Status))
3361         {
3362             return;
3363         }
3364 
3365         /* Only Socket subtables are expected at this level */
3366 
3367         if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET)
3368         {
3369             AcpiOsPrintf (
3370                 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3371                 Subtable->Type);
3372             return;
3373         }
3374 
3375         /* Dump the fixed-length portion of the subtable */
3376 
3377         Status = AcpiDmDumpTable (Length, Offset, Subtable,
3378             Subtable->Length, AcpiDmTableInfoPmtt0);
3379         if (ACPI_FAILURE (Status))
3380         {
3381             return;
3382         }
3383 
3384         /* Walk the memory controller subtables */
3385 
3386         MemOffset = sizeof (ACPI_PMTT_SOCKET);
3387         MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
3388             sizeof (ACPI_PMTT_SOCKET));
3389 
3390         while (((Offset + MemOffset) < Table->Length) &&
3391             (MemOffset < Subtable->Length))
3392         {
3393             /* Common subtable header */
3394 
3395             AcpiOsPrintf ("\n");
3396             Status = AcpiDmDumpTable (Length,
3397                 Offset + MemOffset, MemSubtable,
3398                 MemSubtable->Length, AcpiDmTableInfoPmttHdr);
3399             if (ACPI_FAILURE (Status))
3400             {
3401                 return;
3402             }
3403 
3404             /* Only memory controller subtables are expected at this level */
3405 
3406             if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER)
3407             {
3408                 AcpiOsPrintf (
3409                     "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3410                     MemSubtable->Type);
3411                 return;
3412             }
3413 
3414             /* Dump the fixed-length portion of the controller subtable */
3415 
3416             Status = AcpiDmDumpTable (Length,
3417                 Offset + MemOffset, MemSubtable,
3418                 MemSubtable->Length, AcpiDmTableInfoPmtt1);
3419             if (ACPI_FAILURE (Status))
3420             {
3421                 return;
3422             }
3423 
3424             /* Walk the variable count of proximity domains */
3425 
3426             DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
3427             DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
3428             DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
3429                 sizeof (ACPI_PMTT_CONTROLLER));
3430 
3431             while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
3432                 ((MemOffset + DomainOffset) < Subtable->Length) &&
3433                 DomainCount)
3434             {
3435                 Status = AcpiDmDumpTable (Length,
3436                     Offset + MemOffset + DomainOffset, DomainArray,
3437                     sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
3438                 if (ACPI_FAILURE (Status))
3439                 {
3440                     return;
3441                 }
3442 
3443                 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
3444                 DomainArray++;
3445                 DomainCount--;
3446             }
3447 
3448             if (DomainCount)
3449             {
3450                 AcpiOsPrintf (
3451                     "\n**** DomainCount exceeds subtable length\n\n");
3452             }
3453 
3454             /* Walk the physical component (DIMM) subtables */
3455 
3456             DimmOffset = DomainOffset;
3457             DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
3458                 DomainOffset);
3459 
3460             while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
3461                 (DimmOffset < MemSubtable->Length))
3462             {
3463                 /* Common subtable header */
3464 
3465                 AcpiOsPrintf ("\n");
3466                 Status = AcpiDmDumpTable (Length,
3467                     Offset + MemOffset + DimmOffset, DimmSubtable,
3468                     DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
3469                 if (ACPI_FAILURE (Status))
3470                 {
3471                     return;
3472                 }
3473 
3474                 /* Only DIMM subtables are expected at this level */
3475 
3476                 if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM)
3477                 {
3478                     AcpiOsPrintf (
3479                         "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3480                         DimmSubtable->Type);
3481                     return;
3482                 }
3483 
3484                 /* Dump the fixed-length DIMM subtable */
3485 
3486                 Status = AcpiDmDumpTable (Length,
3487                     Offset + MemOffset + DimmOffset, DimmSubtable,
3488                     DimmSubtable->Length, AcpiDmTableInfoPmtt2);
3489                 if (ACPI_FAILURE (Status))
3490                 {
3491                     return;
3492                 }
3493 
3494                 /* Point to next DIMM subtable */
3495 
3496                 DimmOffset += DimmSubtable->Length;
3497                 DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3498                     DimmSubtable, DimmSubtable->Length);
3499             }
3500 
3501             /* Point to next Controller subtable */
3502 
3503             MemOffset += MemSubtable->Length;
3504             MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3505                 MemSubtable, MemSubtable->Length);
3506         }
3507 
3508         /* Point to next Socket subtable */
3509 
3510         Offset += Subtable->Length;
3511         Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3512             Subtable, Subtable->Length);
3513     }
3514 }
3515 
3516 
3517 /*******************************************************************************
3518  *
3519  * FUNCTION:    AcpiDmDumpPptt
3520  *
3521  * PARAMETERS:  Table               - A PMTT table
3522  *
3523  * RETURN:      None
3524  *
3525  * DESCRIPTION: Format the contents of a PPTT. This table type consists
3526  *              of an open-ended number of subtables.
3527  *
3528  ******************************************************************************/
3529 
3530 void
3531 AcpiDmDumpPptt (
3532     ACPI_TABLE_HEADER       *Table)
3533 {
3534     ACPI_STATUS             Status;
3535     ACPI_SUBTABLE_HEADER    *Subtable;
3536     ACPI_PPTT_PROCESSOR     *PpttProcessor;
3537     UINT8                   Length;
3538     UINT8                   SubtableOffset;
3539     UINT32                  Offset = sizeof (ACPI_TABLE_FPDT);
3540     ACPI_DMTABLE_INFO       *InfoTable;
3541     UINT32                  i;
3542 
3543 
3544     /* There is no main table (other than the standard ACPI header) */
3545 
3546     /* Subtables */
3547 
3548     Offset = sizeof (ACPI_TABLE_HEADER);
3549     while (Offset < Table->Length)
3550     {
3551         AcpiOsPrintf ("\n");
3552 
3553         /* Common subtable header */
3554 
3555         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
3556         if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER))
3557         {
3558             AcpiOsPrintf ("Invalid subtable length\n");
3559             return;
3560         }
3561         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3562             Subtable->Length, AcpiDmTableInfoPpttHdr);
3563         if (ACPI_FAILURE (Status))
3564         {
3565             return;
3566         }
3567 
3568         switch (Subtable->Type)
3569         {
3570         case ACPI_PPTT_TYPE_PROCESSOR:
3571 
3572             InfoTable = AcpiDmTableInfoPptt0;
3573             Length = sizeof (ACPI_PPTT_PROCESSOR);
3574             break;
3575 
3576         case ACPI_PPTT_TYPE_CACHE:
3577 
3578             InfoTable = AcpiDmTableInfoPptt1;
3579             Length = sizeof (ACPI_PPTT_CACHE);
3580             break;
3581 
3582         case ACPI_PPTT_TYPE_ID:
3583 
3584             InfoTable = AcpiDmTableInfoPptt2;
3585             Length = sizeof (ACPI_PPTT_ID);
3586             break;
3587 
3588         default:
3589 
3590             AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n",
3591                 Subtable->Type);
3592 
3593             /* Attempt to continue */
3594 
3595             goto NextSubtable;
3596         }
3597 
3598         if (Subtable->Length < Length)
3599         {
3600             AcpiOsPrintf ("Invalid subtable length\n");
3601             return;
3602         }
3603         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3604             Subtable->Length, InfoTable);
3605         if (ACPI_FAILURE (Status))
3606         {
3607             return;
3608         }
3609         SubtableOffset = Length;
3610 
3611         switch (Subtable->Type)
3612         {
3613         case ACPI_PPTT_TYPE_PROCESSOR:
3614 
3615             PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable);
3616 
3617             /* Dump SMBIOS handles */
3618 
3619             if ((UINT8)(Subtable->Length - SubtableOffset) <
3620                 (UINT8)(PpttProcessor->NumberOfPrivResources * 4))
3621             {
3622                 AcpiOsPrintf ("Invalid private resource number\n");
3623                 return;
3624             }
3625             for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++)
3626             {
3627                 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
3628                     ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset),
3629                     4, AcpiDmTableInfoPptt0a);
3630                 SubtableOffset += 4;
3631             }
3632             break;
3633 
3634         default:
3635 
3636             break;
3637         }
3638 
3639 NextSubtable:
3640         /* Point to next subtable */
3641 
3642         Offset += Subtable->Length;
3643     }
3644 }
3645 
3646 
3647 /*******************************************************************************
3648  *
3649  * FUNCTION:    AcpiDmDumpS3pt
3650  *
3651  * PARAMETERS:  Table               - A S3PT table
3652  *
3653  * RETURN:      Length of the table
3654  *
3655  * DESCRIPTION: Format the contents of a S3PT
3656  *
3657  ******************************************************************************/
3658 
3659 UINT32
3660 AcpiDmDumpS3pt (
3661     ACPI_TABLE_HEADER       *Tables)
3662 {
3663     ACPI_STATUS             Status;
3664     UINT32                  Offset = sizeof (ACPI_TABLE_S3PT);
3665     ACPI_FPDT_HEADER        *Subtable;
3666     ACPI_DMTABLE_INFO       *InfoTable;
3667     ACPI_TABLE_S3PT         *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
3668 
3669 
3670     /* Main table */
3671 
3672     Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
3673     if (ACPI_FAILURE (Status))
3674     {
3675         return 0;
3676     }
3677 
3678     Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
3679     while (Offset < S3ptTable->Length)
3680     {
3681         /* Common subtable header */
3682 
3683         AcpiOsPrintf ("\n");
3684         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
3685             Subtable->Length, AcpiDmTableInfoS3ptHdr);
3686         if (ACPI_FAILURE (Status))
3687         {
3688             return 0;
3689         }
3690 
3691         switch (Subtable->Type)
3692         {
3693         case ACPI_S3PT_TYPE_RESUME:
3694 
3695             InfoTable = AcpiDmTableInfoS3pt0;
3696             break;
3697 
3698         case ACPI_S3PT_TYPE_SUSPEND:
3699 
3700             InfoTable = AcpiDmTableInfoS3pt1;
3701             break;
3702 
3703         default:
3704 
3705             AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
3706                 Subtable->Type);
3707 
3708             /* Attempt to continue */
3709 
3710             if (!Subtable->Length)
3711             {
3712                 AcpiOsPrintf ("Invalid zero length subtable\n");
3713                 return 0;
3714             }
3715             goto NextSubtable;
3716         }
3717 
3718         AcpiOsPrintf ("\n");
3719         Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
3720             Subtable->Length, InfoTable);
3721         if (ACPI_FAILURE (Status))
3722         {
3723             return 0;
3724         }
3725 
3726 NextSubtable:
3727         /* Point to next subtable */
3728 
3729         Offset += Subtable->Length;
3730         Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length);
3731     }
3732 
3733     return (S3ptTable->Length);
3734 }
3735 
3736 
3737 
3738 /*******************************************************************************
3739  *
3740  * FUNCTION:    AcpiDmDumpSdev
3741  *
3742  * PARAMETERS:  Table               - A SDEV table
3743  *
3744  * RETURN:      None
3745  *
3746  * DESCRIPTION: Format the contents of a SDEV. This is a variable-length
3747  *              table that contains variable strings and vendor data.
3748  *
3749  ******************************************************************************/
3750 
3751 void
3752 AcpiDmDumpSdev (
3753     ACPI_TABLE_HEADER       *Table)
3754 {
3755     ACPI_STATUS             Status;
3756     ACPI_SDEV_HEADER        *Subtable;
3757     ACPI_SDEV_PCIE          *Pcie;
3758     ACPI_SDEV_NAMESPACE     *Namesp;
3759     ACPI_DMTABLE_INFO       *InfoTable;
3760     UINT32                  Length = Table->Length;
3761     UINT32                  Offset = sizeof (ACPI_TABLE_SDEV);
3762     UINT16                  PathOffset;
3763     UINT16                  PathLength;
3764     UINT16                  VendorDataOffset;
3765     UINT16                  VendorDataLength;
3766 
3767 
3768     /* Main table */
3769 
3770     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
3771     if (ACPI_FAILURE (Status))
3772     {
3773         return;
3774     }
3775 
3776     /* Subtables */
3777 
3778     Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
3779     while (Offset < Table->Length)
3780     {
3781         /* Common subtable header */
3782 
3783         AcpiOsPrintf ("\n");
3784         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3785             Subtable->Length, AcpiDmTableInfoSdevHdr);
3786         if (ACPI_FAILURE (Status))
3787         {
3788             return;
3789         }
3790 
3791         switch (Subtable->Type)
3792         {
3793         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
3794 
3795             InfoTable = AcpiDmTableInfoSdev0;
3796             break;
3797 
3798         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
3799 
3800             InfoTable = AcpiDmTableInfoSdev1;
3801             break;
3802 
3803         default:
3804             goto NextSubtable;
3805         }
3806 
3807         AcpiOsPrintf ("\n");
3808         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
3809             Subtable->Length, InfoTable);
3810         if (ACPI_FAILURE (Status))
3811         {
3812             return;
3813         }
3814 
3815         switch (Subtable->Type)
3816         {
3817         case ACPI_SDEV_TYPE_NAMESPACE_DEVICE:
3818 
3819             /* Dump the PCIe device ID(s) */
3820 
3821             Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
3822             PathOffset = Namesp->DeviceIdOffset;
3823             PathLength = Namesp->DeviceIdLength;
3824 
3825             if (PathLength)
3826             {
3827                 Status = AcpiDmDumpTable (Table->Length, 0,
3828                     ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
3829                     PathLength, AcpiDmTableInfoSdev0a);
3830                 if (ACPI_FAILURE (Status))
3831                 {
3832                     return;
3833                 }
3834             }
3835 
3836             /* Dump the vendor-specific data */
3837 
3838             VendorDataLength =
3839                 Namesp->VendorDataLength;
3840             VendorDataOffset =
3841                 Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
3842 
3843             if (VendorDataLength)
3844             {
3845                 Status = AcpiDmDumpTable (Table->Length, 0,
3846                     ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
3847                     VendorDataLength, AcpiDmTableInfoSdev1b);
3848                 if (ACPI_FAILURE (Status))
3849                 {
3850                     return;
3851                 }
3852             }
3853             break;
3854 
3855         case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
3856 
3857             /* PCI path substructures */
3858 
3859             Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
3860             PathOffset = Pcie->PathOffset;
3861             PathLength = Pcie->PathLength;
3862 
3863             while (PathLength)
3864             {
3865                 Status = AcpiDmDumpTable (Table->Length,
3866                     PathOffset + Offset,
3867                     ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
3868                     sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
3869                 if (ACPI_FAILURE (Status))
3870                 {
3871                     return;
3872                 }
3873 
3874                 PathOffset += sizeof (ACPI_SDEV_PCIE_PATH);
3875                 PathLength -= sizeof (ACPI_SDEV_PCIE_PATH);
3876             }
3877 
3878             /* VendorData */
3879 
3880             VendorDataLength = Pcie->VendorDataLength;
3881             VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
3882 
3883             if (VendorDataLength)
3884             {
3885                 Status = AcpiDmDumpTable (Table->Length, 0,
3886                     ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
3887                     VendorDataLength, AcpiDmTableInfoSdev1b);
3888             }
3889             break;
3890 
3891         default:
3892             goto NextSubtable;
3893         }
3894 
3895 NextSubtable:
3896         /* Point to next subtable */
3897 
3898         Offset += Subtable->Length;
3899         Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
3900             Subtable->Length);
3901     }
3902 }
3903 
3904 
3905 /*******************************************************************************
3906  *
3907  * FUNCTION:    AcpiDmDumpSlic
3908  *
3909  * PARAMETERS:  Table               - A SLIC table
3910  *
3911  * RETURN:      None
3912  *
3913  * DESCRIPTION: Format the contents of a SLIC
3914  *
3915  ******************************************************************************/
3916 
3917 void
3918 AcpiDmDumpSlic (
3919     ACPI_TABLE_HEADER       *Table)
3920 {
3921 
3922     (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
3923         Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
3924 }
3925 
3926 
3927 /*******************************************************************************
3928  *
3929  * FUNCTION:    AcpiDmDumpSlit
3930  *
3931  * PARAMETERS:  Table               - An SLIT
3932  *
3933  * RETURN:      None
3934  *
3935  * DESCRIPTION: Format the contents of a SLIT
3936  *
3937  ******************************************************************************/
3938 
3939 void
3940 AcpiDmDumpSlit (
3941     ACPI_TABLE_HEADER       *Table)
3942 {
3943     ACPI_STATUS             Status;
3944     UINT32                  Offset;
3945     UINT8                   *Row;
3946     UINT32                  Localities;
3947     UINT32                  i;
3948     UINT32                  j;
3949 
3950 
3951     /* Main table */
3952 
3953     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
3954     if (ACPI_FAILURE (Status))
3955     {
3956         return;
3957     }
3958 
3959     /* Display the Locality NxN Matrix */
3960 
3961     Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
3962     Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
3963     Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
3964 
3965     for (i = 0; i < Localities; i++)
3966     {
3967         /* Display one row of the matrix */
3968 
3969         AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
3970         for  (j = 0; j < Localities; j++)
3971         {
3972             /* Check for beyond EOT */
3973 
3974             if (Offset >= Table->Length)
3975             {
3976                 AcpiOsPrintf (
3977                     "\n**** Not enough room in table for all localities\n");
3978                 return;
3979             }
3980 
3981             AcpiOsPrintf ("%2.2X", Row[j]);
3982             Offset++;
3983 
3984             /* Display up to 16 bytes per output row */
3985 
3986             if ((j+1) < Localities)
3987             {
3988                 AcpiOsPrintf (" ");
3989 
3990                 if (j && (((j+1) % 16) == 0))
3991                 {
3992                     AcpiOsPrintf ("\\\n"); /* With line continuation char */
3993                     AcpiDmLineHeader (Offset, 0, NULL);
3994                 }
3995             }
3996         }
3997 
3998         /* Point to next row */
3999 
4000         AcpiOsPrintf ("\n");
4001         Row += Localities;
4002     }
4003 }
4004 
4005 
4006 /*******************************************************************************
4007  *
4008  * FUNCTION:    AcpiDmDumpSrat
4009  *
4010  * PARAMETERS:  Table               - A SRAT table
4011  *
4012  * RETURN:      None
4013  *
4014  * DESCRIPTION: Format the contents of a SRAT
4015  *
4016  ******************************************************************************/
4017 
4018 void
4019 AcpiDmDumpSrat (
4020     ACPI_TABLE_HEADER       *Table)
4021 {
4022     ACPI_STATUS             Status;
4023     UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
4024     ACPI_SUBTABLE_HEADER    *Subtable;
4025     ACPI_DMTABLE_INFO       *InfoTable;
4026 
4027 
4028     /* Main table */
4029 
4030     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
4031     if (ACPI_FAILURE (Status))
4032     {
4033         return;
4034     }
4035 
4036     /* Subtables */
4037 
4038     Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
4039     while (Offset < Table->Length)
4040     {
4041         /* Common subtable header */
4042 
4043         AcpiOsPrintf ("\n");
4044         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4045             Subtable->Length, AcpiDmTableInfoSratHdr);
4046         if (ACPI_FAILURE (Status))
4047         {
4048             return;
4049         }
4050 
4051         switch (Subtable->Type)
4052         {
4053         case ACPI_SRAT_TYPE_CPU_AFFINITY:
4054 
4055             InfoTable = AcpiDmTableInfoSrat0;
4056             break;
4057 
4058         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
4059 
4060             InfoTable = AcpiDmTableInfoSrat1;
4061             break;
4062 
4063         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
4064 
4065             InfoTable = AcpiDmTableInfoSrat2;
4066             break;
4067 
4068         case ACPI_SRAT_TYPE_GICC_AFFINITY:
4069 
4070             InfoTable = AcpiDmTableInfoSrat3;
4071             break;
4072 
4073         case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
4074 
4075             InfoTable = AcpiDmTableInfoSrat4;
4076             break;
4077 
4078         default:
4079             AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
4080                 Subtable->Type);
4081 
4082             /* Attempt to continue */
4083 
4084             if (!Subtable->Length)
4085             {
4086                 AcpiOsPrintf ("Invalid zero length subtable\n");
4087                 return;
4088             }
4089             goto NextSubtable;
4090         }
4091 
4092         AcpiOsPrintf ("\n");
4093         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4094             Subtable->Length, InfoTable);
4095         if (ACPI_FAILURE (Status))
4096         {
4097             return;
4098         }
4099 
4100 NextSubtable:
4101         /* Point to next subtable */
4102 
4103         Offset += Subtable->Length;
4104         Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
4105             Subtable->Length);
4106     }
4107 }
4108 
4109 
4110 /*******************************************************************************
4111  *
4112  * FUNCTION:    AcpiDmDumpStao
4113  *
4114  * PARAMETERS:  Table               - A STAO table
4115  *
4116  * RETURN:      None
4117  *
4118  * DESCRIPTION: Format the contents of a STAO. This is a variable-length
4119  *              table that contains an open-ended number of ASCII strings
4120  *              at the end of the table.
4121  *
4122  ******************************************************************************/
4123 
4124 void
4125 AcpiDmDumpStao (
4126     ACPI_TABLE_HEADER       *Table)
4127 {
4128     ACPI_STATUS             Status;
4129     char                    *Namepath;
4130     UINT32                  Length = Table->Length;
4131     UINT32                  StringLength;
4132     UINT32                  Offset = sizeof (ACPI_TABLE_STAO);
4133 
4134 
4135     /* Main table */
4136 
4137     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
4138     if (ACPI_FAILURE (Status))
4139     {
4140         return;
4141     }
4142 
4143     /* The rest of the table consists of Namepath strings */
4144 
4145     while (Offset < Table->Length)
4146     {
4147         Namepath = ACPI_ADD_PTR (char, Table, Offset);
4148         StringLength = strlen (Namepath) + 1;
4149 
4150         AcpiDmLineHeader (Offset, StringLength, "Namestring");
4151         AcpiOsPrintf ("\"%s\"\n", Namepath);
4152 
4153         /* Point to next namepath */
4154 
4155         Offset += StringLength;
4156     }
4157 }
4158 
4159 
4160 /*******************************************************************************
4161  *
4162  * FUNCTION:    AcpiDmDumpTcpa
4163  *
4164  * PARAMETERS:  Table               - A TCPA table
4165  *
4166  * RETURN:      None
4167  *
4168  * DESCRIPTION: Format the contents of a TCPA.
4169  *
4170  * NOTE:        There are two versions of the table with the same signature:
4171  *              the client version and the server version. The common
4172  *              PlatformClass field is used to differentiate the two types of
4173  *              tables.
4174  *
4175  ******************************************************************************/
4176 
4177 void
4178 AcpiDmDumpTcpa (
4179     ACPI_TABLE_HEADER       *Table)
4180 {
4181     UINT32                  Offset = sizeof (ACPI_TABLE_TCPA_HDR);
4182     ACPI_TABLE_TCPA_HDR     *CommonHeader = ACPI_CAST_PTR (
4183                                 ACPI_TABLE_TCPA_HDR, Table);
4184     ACPI_TABLE_TCPA_HDR     *Subtable = ACPI_ADD_PTR (
4185                                 ACPI_TABLE_TCPA_HDR, Table, Offset);
4186     ACPI_STATUS             Status;
4187 
4188 
4189     /* Main table */
4190 
4191     Status = AcpiDmDumpTable (Table->Length, 0, Table,
4192         0, AcpiDmTableInfoTcpaHdr);
4193     if (ACPI_FAILURE (Status))
4194     {
4195         return;
4196     }
4197 
4198     /*
4199      * Examine the PlatformClass field to determine the table type.
4200      * Either a client or server table. Only one.
4201      */
4202     switch (CommonHeader->PlatformClass)
4203     {
4204     case ACPI_TCPA_CLIENT_TABLE:
4205 
4206         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4207             Table->Length - Offset, AcpiDmTableInfoTcpaClient);
4208         break;
4209 
4210     case ACPI_TCPA_SERVER_TABLE:
4211 
4212         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4213             Table->Length - Offset, AcpiDmTableInfoTcpaServer);
4214         break;
4215 
4216     default:
4217 
4218         AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
4219             CommonHeader->PlatformClass);
4220         Status = AE_ERROR;
4221         break;
4222     }
4223 
4224     if (ACPI_FAILURE (Status))
4225     {
4226         AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
4227     }
4228 }
4229 
4230 
4231 /*******************************************************************************
4232  *
4233  * FUNCTION:    AcpiDmDumpTpm2
4234  *
4235  * PARAMETERS:  Table               - A TPM2 table
4236  *
4237  * RETURN:      None
4238  *
4239  * DESCRIPTION: Format the contents of a TPM2.
4240  *
4241  ******************************************************************************/
4242 
4243 void
4244 AcpiDmDumpTpm2 (
4245     ACPI_TABLE_HEADER       *Table)
4246 {
4247     UINT32                  Offset = sizeof (ACPI_TABLE_TPM2);
4248     ACPI_TABLE_TPM2         *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM2, Table);
4249     ACPI_TPM2_TRAILER       *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset);
4250     ACPI_TPM2_ARM_SMC       *ArmSubtable;
4251     ACPI_STATUS             Status;
4252 
4253 
4254     /* Main table */
4255 
4256     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2);
4257     if (ACPI_FAILURE (Status))
4258     {
4259         return;
4260     }
4261 
4262     AcpiOsPrintf ("\n");
4263     Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4264         Table->Length - Offset, AcpiDmTableInfoTpm2a);
4265     if (ACPI_FAILURE (Status))
4266     {
4267         return;
4268     }
4269 
4270     switch (CommonHeader->StartMethod)
4271     {
4272     case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
4273 
4274         ArmSubtable = ACPI_ADD_PTR (ACPI_TPM2_ARM_SMC, Subtable,
4275             sizeof (ACPI_TPM2_TRAILER));
4276         Offset += sizeof (ACPI_TPM2_TRAILER);
4277 
4278         AcpiOsPrintf ("\n");
4279         Status = AcpiDmDumpTable (Table->Length, Offset, ArmSubtable,
4280             Table->Length - Offset, AcpiDmTableInfoTpm211);
4281         break;
4282 
4283     default:
4284         break;
4285     }
4286 }
4287 
4288 
4289 /*******************************************************************************
4290  *
4291  * FUNCTION:    AcpiDmDumpVrtc
4292  *
4293  * PARAMETERS:  Table               - A VRTC table
4294  *
4295  * RETURN:      None
4296  *
4297  * DESCRIPTION: Format the contents of a VRTC
4298  *
4299  ******************************************************************************/
4300 
4301 void
4302 AcpiDmDumpVrtc (
4303     ACPI_TABLE_HEADER       *Table)
4304 {
4305     ACPI_STATUS             Status;
4306     UINT32                  Offset = sizeof (ACPI_TABLE_VRTC);
4307     ACPI_VRTC_ENTRY         *Subtable;
4308 
4309 
4310     /* Main table */
4311 
4312     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
4313     if (ACPI_FAILURE (Status))
4314     {
4315         return;
4316     }
4317 
4318     /* Subtables */
4319 
4320     Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
4321     while (Offset < Table->Length)
4322     {
4323         /* Common subtable header */
4324 
4325         AcpiOsPrintf ("\n");
4326         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4327             sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
4328         if (ACPI_FAILURE (Status))
4329         {
4330             return;
4331         }
4332 
4333         /* Point to next subtable */
4334 
4335         Offset += sizeof (ACPI_VRTC_ENTRY);
4336         Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Subtable,
4337             sizeof (ACPI_VRTC_ENTRY));
4338     }
4339 }
4340 
4341 
4342 /*******************************************************************************
4343  *
4344  * FUNCTION:    AcpiDmDumpWdat
4345  *
4346  * PARAMETERS:  Table               - A WDAT table
4347  *
4348  * RETURN:      None
4349  *
4350  * DESCRIPTION: Format the contents of a WDAT
4351  *
4352  ******************************************************************************/
4353 
4354 void
4355 AcpiDmDumpWdat (
4356     ACPI_TABLE_HEADER       *Table)
4357 {
4358     ACPI_STATUS             Status;
4359     UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
4360     ACPI_WDAT_ENTRY         *Subtable;
4361 
4362 
4363     /* Main table */
4364 
4365     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
4366     if (ACPI_FAILURE (Status))
4367     {
4368         return;
4369     }
4370 
4371     /* Subtables */
4372 
4373     Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
4374     while (Offset < Table->Length)
4375     {
4376         /* Common subtable header */
4377 
4378         AcpiOsPrintf ("\n");
4379         Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
4380             sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
4381         if (ACPI_FAILURE (Status))
4382         {
4383             return;
4384         }
4385 
4386         /* Point to next subtable */
4387 
4388         Offset += sizeof (ACPI_WDAT_ENTRY);
4389         Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Subtable,
4390             sizeof (ACPI_WDAT_ENTRY));
4391     }
4392 }
4393 
4394 
4395 /*******************************************************************************
4396  *
4397  * FUNCTION:    AcpiDmDumpWpbt
4398  *
4399  * PARAMETERS:  Table               - A WPBT table
4400  *
4401  * RETURN:      None
4402  *
4403  * DESCRIPTION: Format the contents of a WPBT. This table type consists
4404  *              of an open-ended arguments buffer at the end of the table.
4405  *
4406  ******************************************************************************/
4407 
4408 void
4409 AcpiDmDumpWpbt (
4410     ACPI_TABLE_HEADER       *Table)
4411 {
4412     ACPI_STATUS             Status;
4413     ACPI_TABLE_WPBT         *Subtable;
4414     UINT32                  Length = Table->Length;
4415     UINT16                  ArgumentsLength;
4416 
4417 
4418     /* Dump the main table */
4419 
4420     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
4421     if (ACPI_FAILURE (Status))
4422     {
4423         return;
4424     }
4425 
4426     /* Extract the arguments buffer length from the main table */
4427 
4428     Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
4429     ArgumentsLength = Subtable->ArgumentsLength;
4430 
4431     /* Dump the arguments buffer */
4432 
4433     (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
4434         AcpiDmTableInfoWpbt0);
4435 }
4436