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