xref: /freebsd/sys/contrib/dev/acpica/common/dmtbdump.c (revision aa64588d28258aef88cc33b8043112e8856948d0)
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 - 2010, 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 #include <contrib/dev/acpica/include/acpi.h>
117 #include <contrib/dev/acpica/include/accommon.h>
118 #include <contrib/dev/acpica/include/acdisasm.h>
119 #include <contrib/dev/acpica/include/actables.h>
120 
121 /* This module used for application-level code only */
122 
123 #define _COMPONENT          ACPI_CA_DISASSEMBLER
124         ACPI_MODULE_NAME    ("dmtbdump")
125 
126 
127 /*******************************************************************************
128  *
129  * FUNCTION:    AcpiDmDumpRsdp
130  *
131  * PARAMETERS:  Table               - A RSDP
132  *
133  * RETURN:      Length of the table (there is no length field, use revision)
134  *
135  * DESCRIPTION: Format the contents of a RSDP
136  *
137  ******************************************************************************/
138 
139 UINT32
140 AcpiDmDumpRsdp (
141     ACPI_TABLE_HEADER       *Table)
142 {
143     UINT32                  Length = ACPI_RSDP_REV0_SIZE;
144 
145 
146     /* Dump the common ACPI 1.0 portion */
147 
148     AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
149 
150     /* ACPI 2.0+ contains more data and has a Length field */
151 
152     if (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table)->Revision > 0)
153     {
154         Length = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table)->Length;
155         AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
156     }
157 
158     return (Length);
159 }
160 
161 
162 /*******************************************************************************
163  *
164  * FUNCTION:    AcpiDmDumpRsdt
165  *
166  * PARAMETERS:  Table               - A RSDT
167  *
168  * RETURN:      None
169  *
170  * DESCRIPTION: Format the contents of a RSDT
171  *
172  ******************************************************************************/
173 
174 void
175 AcpiDmDumpRsdt (
176     ACPI_TABLE_HEADER       *Table)
177 {
178     UINT32                  *Array;
179     UINT32                  Entries;
180     UINT32                  Offset;
181     UINT32                  i;
182 
183 
184     /* Point to start of table pointer array */
185 
186     Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
187     Offset = sizeof (ACPI_TABLE_HEADER);
188 
189     /* RSDT uses 32-bit pointers */
190 
191     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
192 
193     for (i = 0; i < Entries; i++)
194     {
195         AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
196         AcpiOsPrintf ("%8.8X\n", Array[i]);
197         Offset += sizeof (UINT32);
198     }
199 }
200 
201 
202 /*******************************************************************************
203  *
204  * FUNCTION:    AcpiDmDumpXsdt
205  *
206  * PARAMETERS:  Table               - A XSDT
207  *
208  * RETURN:      None
209  *
210  * DESCRIPTION: Format the contents of a XSDT
211  *
212  ******************************************************************************/
213 
214 void
215 AcpiDmDumpXsdt (
216     ACPI_TABLE_HEADER       *Table)
217 {
218     UINT64                  *Array;
219     UINT32                  Entries;
220     UINT32                  Offset;
221     UINT32                  i;
222 
223 
224     /* Point to start of table pointer array */
225 
226     Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
227     Offset = sizeof (ACPI_TABLE_HEADER);
228 
229     /* XSDT uses 64-bit pointers */
230 
231     Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
232 
233     for (i = 0; i < Entries; i++)
234     {
235         AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
236         AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
237         Offset += sizeof (UINT64);
238     }
239 }
240 
241 
242 /*******************************************************************************
243  *
244  * FUNCTION:    AcpiDmDumpFadt
245  *
246  * PARAMETERS:  Table               - A FADT
247  *
248  * RETURN:      None
249  *
250  * DESCRIPTION: Format the contents of a FADT
251  *
252  ******************************************************************************/
253 
254 void
255 AcpiDmDumpFadt (
256     ACPI_TABLE_HEADER       *Table)
257 {
258 
259     /* Common ACPI 1.0 portion of FADT */
260 
261     AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
262 
263     /* Check for ACPI 1.0B MS extensions (FADT revision 2) */
264 
265     if (Table->Revision == 2)
266     {
267         AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
268     }
269 
270     /* Check for ACPI 2.0+ extended data (FADT revision 3+) */
271 
272     else if (Table->Length >= sizeof (ACPI_TABLE_FADT))
273     {
274         AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
275     }
276 
277     /* Validate various fields in the FADT, including length */
278 
279     AcpiTbCreateLocalFadt (Table, Table->Length);
280 }
281 
282 
283 /*******************************************************************************
284  *
285  * FUNCTION:    AcpiDmDumpAsf
286  *
287  * PARAMETERS:  Table               - A ASF table
288  *
289  * RETURN:      None
290  *
291  * DESCRIPTION: Format the contents of a ASF table
292  *
293  ******************************************************************************/
294 
295 void
296 AcpiDmDumpAsf (
297     ACPI_TABLE_HEADER       *Table)
298 {
299     ACPI_STATUS             Status;
300     UINT32                  Offset = sizeof (ACPI_TABLE_HEADER);
301     ACPI_ASF_INFO           *SubTable;
302     ACPI_DMTABLE_INFO       *InfoTable;
303     ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
304     UINT8                   *DataTable = NULL;
305     UINT32                  DataCount = 0;
306     UINT32                  DataLength = 0;
307     UINT32                  DataOffset = 0;
308     UINT32                  i;
309     UINT8                   Type;
310 
311 
312     /* No main table, only sub-tables */
313 
314     SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
315     while (Offset < Table->Length)
316     {
317         /* Common sub-table header */
318 
319         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
320                     SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
321         if (ACPI_FAILURE (Status))
322         {
323             return;
324         }
325 
326         /* The actual type is the lower 7 bits of Type */
327 
328         Type = (UINT8) (SubTable->Header.Type & 0x7F);
329 
330         switch (Type)
331         {
332         case ACPI_ASF_TYPE_INFO:
333             InfoTable = AcpiDmTableInfoAsf0;
334             break;
335 
336         case ACPI_ASF_TYPE_ALERT:
337             InfoTable = AcpiDmTableInfoAsf1;
338             DataInfoTable = AcpiDmTableInfoAsf1a;
339             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
340             DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
341             DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
342             DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
343             break;
344 
345         case ACPI_ASF_TYPE_CONTROL:
346             InfoTable = AcpiDmTableInfoAsf2;
347             DataInfoTable = AcpiDmTableInfoAsf2a;
348             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
349             DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
350             DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
351             DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
352             break;
353 
354         case ACPI_ASF_TYPE_BOOT:
355             InfoTable = AcpiDmTableInfoAsf3;
356             break;
357 
358         case ACPI_ASF_TYPE_ADDRESS:
359             InfoTable = AcpiDmTableInfoAsf4;
360             DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
361             DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
362             DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
363             break;
364 
365         default:
366             AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type);
367             return;
368         }
369 
370         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
371                     SubTable->Header.Length, InfoTable);
372         if (ACPI_FAILURE (Status))
373         {
374             return;
375         }
376 
377         /* Dump variable-length extra data */
378 
379         switch (Type)
380         {
381         case ACPI_ASF_TYPE_ALERT:
382         case ACPI_ASF_TYPE_CONTROL:
383 
384             for (i = 0; i < DataCount; i++)
385             {
386                 AcpiOsPrintf ("\n");
387                 Status = AcpiDmDumpTable (Table->Length, DataOffset,
388                             DataTable, DataLength, DataInfoTable);
389                 if (ACPI_FAILURE (Status))
390                 {
391                     return;
392                 }
393 
394                 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
395                 DataOffset += DataLength;
396             }
397             break;
398 
399         case ACPI_ASF_TYPE_ADDRESS:
400 
401             for (i = 0; i < DataLength; i++)
402             {
403                 if (!(i % 16))
404                 {
405                     AcpiDmLineHeader (DataOffset, 1, "Addresses");
406                 }
407 
408                 AcpiOsPrintf ("%2.2X ", *DataTable);
409                 DataTable++;
410                 DataOffset++;
411                 if (DataOffset > Table->Length)
412                 {
413                     AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
414                     return;
415                 }
416             }
417 
418             AcpiOsPrintf ("\n");
419             break;
420 
421         default:
422             break;
423         }
424 
425         AcpiOsPrintf ("\n");
426 
427         /* Point to next sub-table */
428 
429         if (!SubTable->Header.Length)
430         {
431             AcpiOsPrintf ("Invalid zero subtable header length\n");
432             return;
433         }
434 
435         Offset += SubTable->Header.Length;
436         SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
437     }
438 }
439 
440 
441 /*******************************************************************************
442  *
443  * FUNCTION:    AcpiDmDumpCpep
444  *
445  * PARAMETERS:  Table               - A CPEP table
446  *
447  * RETURN:      None
448  *
449  * DESCRIPTION: Format the contents of a CPEP. This table type consists
450  *              of an open-ended number of subtables.
451  *
452  ******************************************************************************/
453 
454 void
455 AcpiDmDumpCpep (
456     ACPI_TABLE_HEADER       *Table)
457 {
458     ACPI_STATUS             Status;
459     ACPI_CPEP_POLLING       *SubTable;
460     UINT32                  Length = Table->Length;
461     UINT32                  Offset = sizeof (ACPI_TABLE_CPEP);
462 
463 
464     /* Main table */
465 
466     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
467     if (ACPI_FAILURE (Status))
468     {
469         return;
470     }
471 
472     /* Sub-tables */
473 
474     SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
475     while (Offset < Table->Length)
476     {
477         AcpiOsPrintf ("\n");
478         Status = AcpiDmDumpTable (Length, Offset, SubTable,
479                     SubTable->Header.Length, AcpiDmTableInfoCpep0);
480         if (ACPI_FAILURE (Status))
481         {
482             return;
483         }
484 
485         /* Point to next sub-table */
486 
487         Offset += SubTable->Header.Length;
488         SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
489                     SubTable->Header.Length);
490     }
491 }
492 
493 
494 /*******************************************************************************
495  *
496  * FUNCTION:    AcpiDmDumpDmar
497  *
498  * PARAMETERS:  Table               - A DMAR table
499  *
500  * RETURN:      None
501  *
502  * DESCRIPTION: Format the contents of a DMAR. This table type consists
503  *              of an open-ended number of subtables.
504  *
505  ******************************************************************************/
506 
507 void
508 AcpiDmDumpDmar (
509     ACPI_TABLE_HEADER       *Table)
510 {
511     ACPI_STATUS             Status;
512     ACPI_DMAR_HEADER        *SubTable;
513     UINT32                  Length = Table->Length;
514     UINT32                  Offset = sizeof (ACPI_TABLE_DMAR);
515     ACPI_DMTABLE_INFO       *InfoTable;
516     ACPI_DMAR_DEVICE_SCOPE  *ScopeTable;
517     UINT32                  ScopeOffset;
518     UINT8                   *PciPath;
519     UINT32                  PathOffset;
520 
521 
522     /* Main table */
523 
524     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
525     if (ACPI_FAILURE (Status))
526     {
527         return;
528     }
529 
530     /* Sub-tables */
531 
532     SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
533     while (Offset < Table->Length)
534     {
535         /* Common sub-table header */
536 
537         AcpiOsPrintf ("\n");
538         Status = AcpiDmDumpTable (Length, Offset, SubTable,
539                     SubTable->Length, AcpiDmTableInfoDmarHdr);
540         if (ACPI_FAILURE (Status))
541         {
542             return;
543         }
544 
545         switch (SubTable->Type)
546         {
547         case ACPI_DMAR_TYPE_HARDWARE_UNIT:
548             InfoTable = AcpiDmTableInfoDmar0;
549             ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
550             break;
551         case ACPI_DMAR_TYPE_RESERVED_MEMORY:
552             InfoTable = AcpiDmTableInfoDmar1;
553             ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
554             break;
555         case ACPI_DMAR_TYPE_ATSR:
556             InfoTable = AcpiDmTableInfoDmar2;
557             ScopeOffset = sizeof (ACPI_DMAR_ATSR);
558             break;
559         case ACPI_DMAR_HARDWARE_AFFINITY:
560             InfoTable = AcpiDmTableInfoDmar3;
561             ScopeOffset = sizeof (ACPI_DMAR_RHSA);
562             break;
563         default:
564             AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type);
565             return;
566         }
567 
568         Status = AcpiDmDumpTable (Length, Offset, SubTable,
569                     SubTable->Length, InfoTable);
570         if (ACPI_FAILURE (Status))
571         {
572             return;
573         }
574 
575         /* Dump the device scope entries (if any) */
576 
577         ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
578         while (ScopeOffset < SubTable->Length)
579         {
580             AcpiOsPrintf ("\n");
581             Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
582                         ScopeTable->Length, AcpiDmTableInfoDmarScope);
583             if (ACPI_FAILURE (Status))
584             {
585                 return;
586             }
587 
588             /* Dump the PCI Path entries for this device scope */
589 
590             PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
591 
592             PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
593                 sizeof (ACPI_DMAR_DEVICE_SCOPE));
594 
595             while (PathOffset < ScopeTable->Length)
596             {
597                 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
598                 AcpiOsPrintf ("[%2.2X, %2.2X]\n", PciPath[0], PciPath[1]);
599 
600                 /* Point to next PCI Path entry */
601 
602                 PathOffset += 2;
603                 PciPath += 2;
604             }
605 
606             /* Point to next device scope entry */
607 
608             ScopeOffset += ScopeTable->Length;
609             ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
610                 ScopeTable, ScopeTable->Length);
611         }
612 
613         /* Point to next sub-table */
614 
615         Offset += SubTable->Length;
616         SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
617     }
618 }
619 
620 
621 /*******************************************************************************
622  *
623  * FUNCTION:    AcpiDmDumpEinj
624  *
625  * PARAMETERS:  Table               - A EINJ table
626  *
627  * RETURN:      None
628  *
629  * DESCRIPTION: Format the contents of a EINJ. This table type consists
630  *              of an open-ended number of subtables.
631  *
632  ******************************************************************************/
633 
634 void
635 AcpiDmDumpEinj (
636     ACPI_TABLE_HEADER       *Table)
637 {
638     ACPI_STATUS             Status;
639     ACPI_WHEA_HEADER        *SubTable;
640     UINT32                  Length = Table->Length;
641     UINT32                  Offset = sizeof (ACPI_TABLE_EINJ);
642 
643 
644     /* Main table */
645 
646     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
647     if (ACPI_FAILURE (Status))
648     {
649         return;
650     }
651 
652     /* Sub-tables */
653 
654     SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
655     while (Offset < Table->Length)
656     {
657         AcpiOsPrintf ("\n");
658         Status = AcpiDmDumpTable (Length, Offset, SubTable,
659                     sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
660         if (ACPI_FAILURE (Status))
661         {
662             return;
663         }
664 
665         /* Point to next sub-table (each subtable is of fixed length) */
666 
667         Offset += sizeof (ACPI_WHEA_HEADER);
668         SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
669                         sizeof (ACPI_WHEA_HEADER));
670     }
671 }
672 
673 
674 /*******************************************************************************
675  *
676  * FUNCTION:    AcpiDmDumpErst
677  *
678  * PARAMETERS:  Table               - A ERST table
679  *
680  * RETURN:      None
681  *
682  * DESCRIPTION: Format the contents of a ERST. This table type consists
683  *              of an open-ended number of subtables.
684  *
685  ******************************************************************************/
686 
687 void
688 AcpiDmDumpErst (
689     ACPI_TABLE_HEADER       *Table)
690 {
691     ACPI_STATUS             Status;
692     ACPI_WHEA_HEADER        *SubTable;
693     UINT32                  Length = Table->Length;
694     UINT32                  Offset = sizeof (ACPI_TABLE_ERST);
695 
696 
697     /* Main table */
698 
699     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
700     if (ACPI_FAILURE (Status))
701     {
702         return;
703     }
704 
705     /* Sub-tables */
706 
707     SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
708     while (Offset < Table->Length)
709     {
710         AcpiOsPrintf ("\n");
711         Status = AcpiDmDumpTable (Length, Offset, SubTable,
712                     sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
713         if (ACPI_FAILURE (Status))
714         {
715             return;
716         }
717 
718         /* Point to next sub-table (each subtable is of fixed length) */
719 
720         Offset += sizeof (ACPI_WHEA_HEADER);
721         SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
722                         sizeof (ACPI_WHEA_HEADER));
723     }
724 }
725 
726 
727 /*******************************************************************************
728  *
729  * FUNCTION:    AcpiDmDumpHest
730  *
731  * PARAMETERS:  Table               - A HEST table
732  *
733  * RETURN:      None
734  *
735  * DESCRIPTION: Format the contents of a HEST. This table type consists
736  *              of an open-ended number of subtables.
737  *
738  ******************************************************************************/
739 
740 void
741 AcpiDmDumpHest (
742     ACPI_TABLE_HEADER       *Table)
743 {
744     ACPI_STATUS             Status;
745     ACPI_HEST_HEADER        *SubTable;
746     UINT32                  Length = Table->Length;
747     UINT32                  Offset = sizeof (ACPI_TABLE_HEST);
748     ACPI_DMTABLE_INFO       *InfoTable;
749     UINT32                  SubTableLength;
750     UINT32                  BankCount;
751     ACPI_HEST_IA_ERROR_BANK *BankTable;
752 
753 
754     /* Main table */
755 
756     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
757     if (ACPI_FAILURE (Status))
758     {
759         return;
760     }
761 
762     /* Sub-tables */
763 
764     SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
765     while (Offset < Table->Length)
766     {
767         BankCount = 0;
768         switch (SubTable->Type)
769         {
770         case ACPI_HEST_TYPE_IA32_CHECK:
771             InfoTable = AcpiDmTableInfoHest0;
772             SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
773             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
774                             SubTable))->NumHardwareBanks;
775             break;
776 
777         case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
778             InfoTable = AcpiDmTableInfoHest1;
779             SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
780             BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
781                             SubTable))->NumHardwareBanks;
782             break;
783 
784         case ACPI_HEST_TYPE_IA32_NMI:
785             InfoTable = AcpiDmTableInfoHest2;
786             SubTableLength = sizeof (ACPI_HEST_IA_NMI);
787             break;
788 
789         case ACPI_HEST_TYPE_AER_ROOT_PORT:
790             InfoTable = AcpiDmTableInfoHest6;
791             SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
792             break;
793 
794         case ACPI_HEST_TYPE_AER_ENDPOINT:
795             InfoTable = AcpiDmTableInfoHest7;
796             SubTableLength = sizeof (ACPI_HEST_AER);
797             break;
798 
799         case ACPI_HEST_TYPE_AER_BRIDGE:
800             InfoTable = AcpiDmTableInfoHest8;
801             SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
802             break;
803 
804         case ACPI_HEST_TYPE_GENERIC_ERROR:
805             InfoTable = AcpiDmTableInfoHest9;
806             SubTableLength = sizeof (ACPI_HEST_GENERIC);
807             break;
808 
809         default:
810             /* Cannot continue on unknown type - no length */
811 
812             AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type);
813             return;
814         }
815 
816         AcpiOsPrintf ("\n");
817         Status = AcpiDmDumpTable (Length, Offset, SubTable,
818                     SubTableLength, InfoTable);
819         if (ACPI_FAILURE (Status))
820         {
821             return;
822         }
823 
824         /* Point to end of current subtable (each subtable above is of fixed length) */
825 
826         Offset += SubTableLength;
827 
828         /* If there are any (fixed-length) Error Banks from above, dump them now */
829 
830         if (BankCount)
831         {
832             BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
833             SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
834 
835             while (BankCount)
836             {
837                 AcpiOsPrintf ("\n");
838                 Status = AcpiDmDumpTable (Length, Offset, BankTable,
839                             sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
840                 if (ACPI_FAILURE (Status))
841                 {
842                     return;
843                 }
844                 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
845                 BankTable++;
846                 BankCount--;
847             }
848         }
849 
850         /* Point to next sub-table */
851 
852         SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
853     }
854 }
855 
856 
857 /*******************************************************************************
858  *
859  * FUNCTION:    AcpiDmDumpIvrs
860  *
861  * PARAMETERS:  Table               - A IVRS table
862  *
863  * RETURN:      None
864  *
865  * DESCRIPTION: Format the contents of a IVRS
866  *
867  ******************************************************************************/
868 
869 static UINT8 EntrySizes[] = {4,8,16,32};
870 
871 void
872 AcpiDmDumpIvrs (
873     ACPI_TABLE_HEADER       *Table)
874 {
875     ACPI_STATUS             Status;
876     UINT32                  Offset = sizeof (ACPI_TABLE_IVRS);
877     UINT32                  EntryOffset;
878     UINT32                  EntryLength;
879     UINT32                  EntryType;
880     ACPI_IVRS_DE_HEADER     *DeviceEntry;
881     ACPI_IVRS_HEADER        *SubTable;
882     ACPI_DMTABLE_INFO       *InfoTable;
883 
884 
885     /* Main table */
886 
887     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
888     if (ACPI_FAILURE (Status))
889     {
890         return;
891     }
892 
893     /* Sub-tables */
894 
895     SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
896     while (Offset < Table->Length)
897     {
898         /* Common sub-table header */
899 
900         AcpiOsPrintf ("\n");
901         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
902                     SubTable->Length, AcpiDmTableInfoIvrsHdr);
903         if (ACPI_FAILURE (Status))
904         {
905             return;
906         }
907 
908         switch (SubTable->Type)
909         {
910         case ACPI_IVRS_TYPE_HARDWARE:
911             InfoTable = AcpiDmTableInfoIvrs0;
912             break;
913         case ACPI_IVRS_TYPE_MEMORY1:
914         case ACPI_IVRS_TYPE_MEMORY2:
915         case ACPI_IVRS_TYPE_MEMORY3:
916             InfoTable = AcpiDmTableInfoIvrs1;
917             break;
918         default:
919             AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n",
920                 SubTable->Type);
921 
922             /* Attempt to continue */
923 
924             if (!SubTable->Length)
925             {
926                 AcpiOsPrintf ("Invalid zero length subtable\n");
927                 return;
928             }
929             goto NextSubTable;
930         }
931 
932         /* Dump the subtable */
933 
934         AcpiOsPrintf ("\n");
935         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
936                     SubTable->Length, InfoTable);
937         if (ACPI_FAILURE (Status))
938         {
939             return;
940         }
941 
942         /* The hardware subtable can contain multiple device entries */
943 
944         if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
945         {
946             EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
947             DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
948                             sizeof (ACPI_IVRS_HARDWARE));
949 
950             while (EntryOffset < (Offset + SubTable->Length))
951             {
952                 AcpiOsPrintf ("\n");
953                 /*
954                  * Upper 2 bits of Type encode the length of the device entry
955                  *
956                  * 00 = 4 byte
957                  * 01 = 8 byte
958                  * 10 = 16 byte - currently no entries defined
959                  * 11 = 32 byte - currently no entries defined
960                  */
961                 EntryType = DeviceEntry->Type;
962                 EntryLength = EntrySizes [EntryType >> 6];
963 
964                 switch (EntryType)
965                 {
966                 /* 4-byte device entries */
967 
968                 case ACPI_IVRS_TYPE_PAD4:
969                 case ACPI_IVRS_TYPE_ALL:
970                 case ACPI_IVRS_TYPE_SELECT:
971                 case ACPI_IVRS_TYPE_START:
972                 case ACPI_IVRS_TYPE_END:
973 
974                     InfoTable = AcpiDmTableInfoIvrs4;
975                     break;
976 
977                 /* 8-byte entries, type A */
978 
979                 case ACPI_IVRS_TYPE_ALIAS_SELECT:
980                 case ACPI_IVRS_TYPE_ALIAS_START:
981 
982                     InfoTable = AcpiDmTableInfoIvrs8a;
983                     break;
984 
985                 /* 8-byte entries, type B */
986 
987                 case ACPI_IVRS_TYPE_PAD8:
988                 case ACPI_IVRS_TYPE_EXT_SELECT:
989                 case ACPI_IVRS_TYPE_EXT_START:
990 
991                     InfoTable = AcpiDmTableInfoIvrs8b;
992                     break;
993 
994                 /* 8-byte entries, type C */
995 
996                 case ACPI_IVRS_TYPE_SPECIAL:
997 
998                     InfoTable = AcpiDmTableInfoIvrs8c;
999                     break;
1000 
1001                 default:
1002                     InfoTable = AcpiDmTableInfoIvrs4;
1003                     AcpiOsPrintf (
1004                         "\n**** Unknown IVRS device entry type/length: "
1005                         "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
1006                         EntryType, EntryLength, EntryOffset);
1007                     break;
1008                 }
1009 
1010                 /* Dump the Device Entry */
1011 
1012                 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
1013                             DeviceEntry, EntryLength, InfoTable);
1014 
1015                 EntryOffset += EntryLength;
1016                 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
1017                                 EntryLength);
1018             }
1019         }
1020 
1021 NextSubTable:
1022         /* Point to next sub-table */
1023 
1024         Offset += SubTable->Length;
1025         SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
1026     }
1027 }
1028 
1029 
1030 /*******************************************************************************
1031  *
1032  * FUNCTION:    AcpiDmDumpMadt
1033  *
1034  * PARAMETERS:  Table               - A MADT table
1035  *
1036  * RETURN:      None
1037  *
1038  * DESCRIPTION: Format the contents of a MADT. This table type consists
1039  *              of an open-ended number of subtables.
1040  *
1041  ******************************************************************************/
1042 
1043 void
1044 AcpiDmDumpMadt (
1045     ACPI_TABLE_HEADER       *Table)
1046 {
1047     ACPI_STATUS             Status;
1048     ACPI_SUBTABLE_HEADER    *SubTable;
1049     UINT32                  Length = Table->Length;
1050     UINT32                  Offset = sizeof (ACPI_TABLE_MADT);
1051     ACPI_DMTABLE_INFO       *InfoTable;
1052 
1053 
1054     /* Main table */
1055 
1056     Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
1057     if (ACPI_FAILURE (Status))
1058     {
1059         return;
1060     }
1061 
1062     /* Sub-tables */
1063 
1064     SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1065     while (Offset < Table->Length)
1066     {
1067         /* Common sub-table header */
1068 
1069         AcpiOsPrintf ("\n");
1070         Status = AcpiDmDumpTable (Length, Offset, SubTable,
1071                     SubTable->Length, AcpiDmTableInfoMadtHdr);
1072         if (ACPI_FAILURE (Status))
1073         {
1074             return;
1075         }
1076 
1077         switch (SubTable->Type)
1078         {
1079         case ACPI_MADT_TYPE_LOCAL_APIC:
1080             InfoTable = AcpiDmTableInfoMadt0;
1081             break;
1082         case ACPI_MADT_TYPE_IO_APIC:
1083             InfoTable = AcpiDmTableInfoMadt1;
1084             break;
1085         case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1086             InfoTable = AcpiDmTableInfoMadt2;
1087             break;
1088         case ACPI_MADT_TYPE_NMI_SOURCE:
1089             InfoTable = AcpiDmTableInfoMadt3;
1090             break;
1091         case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1092             InfoTable = AcpiDmTableInfoMadt4;
1093             break;
1094         case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1095             InfoTable = AcpiDmTableInfoMadt5;
1096             break;
1097         case ACPI_MADT_TYPE_IO_SAPIC:
1098             InfoTable = AcpiDmTableInfoMadt6;
1099             break;
1100         case ACPI_MADT_TYPE_LOCAL_SAPIC:
1101             InfoTable = AcpiDmTableInfoMadt7;
1102             break;
1103         case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1104             InfoTable = AcpiDmTableInfoMadt8;
1105             break;
1106         case ACPI_MADT_TYPE_LOCAL_X2APIC:
1107             InfoTable = AcpiDmTableInfoMadt9;
1108             break;
1109         case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1110             InfoTable = AcpiDmTableInfoMadt10;
1111             break;
1112         default:
1113             AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type);
1114 
1115             /* Attempt to continue */
1116 
1117             if (!SubTable->Length)
1118             {
1119                 AcpiOsPrintf ("Invalid zero length subtable\n");
1120                 return;
1121             }
1122             goto NextSubTable;
1123         }
1124 
1125         Status = AcpiDmDumpTable (Length, Offset, SubTable,
1126                     SubTable->Length, InfoTable);
1127         if (ACPI_FAILURE (Status))
1128         {
1129             return;
1130         }
1131 
1132 NextSubTable:
1133         /* Point to next sub-table */
1134 
1135         Offset += SubTable->Length;
1136         SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1137     }
1138 }
1139 
1140 
1141 /*******************************************************************************
1142  *
1143  * FUNCTION:    AcpiDmDumpMcfg
1144  *
1145  * PARAMETERS:  Table               - A MCFG Table
1146  *
1147  * RETURN:      None
1148  *
1149  * DESCRIPTION: Format the contents of a MCFG table
1150  *
1151  ******************************************************************************/
1152 
1153 void
1154 AcpiDmDumpMcfg (
1155     ACPI_TABLE_HEADER       *Table)
1156 {
1157     ACPI_STATUS             Status;
1158     UINT32                  Offset = sizeof (ACPI_TABLE_MCFG);
1159     ACPI_MCFG_ALLOCATION    *SubTable;
1160 
1161 
1162     /* Main table */
1163 
1164     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
1165     if (ACPI_FAILURE (Status))
1166     {
1167         return;
1168     }
1169 
1170     /* Sub-tables */
1171 
1172     SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
1173     while (Offset < Table->Length)
1174     {
1175         if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
1176         {
1177             AcpiOsPrintf ("Warning: there are %d invalid trailing bytes\n",
1178                 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
1179             return;
1180         }
1181 
1182         AcpiOsPrintf ("\n");
1183         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1184                     sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
1185         if (ACPI_FAILURE (Status))
1186         {
1187             return;
1188         }
1189 
1190         /* Point to next sub-table (each subtable is of fixed length) */
1191 
1192         Offset += sizeof (ACPI_MCFG_ALLOCATION);
1193         SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
1194                         sizeof (ACPI_MCFG_ALLOCATION));
1195     }
1196 }
1197 
1198 
1199 /*******************************************************************************
1200  *
1201  * FUNCTION:    AcpiDmDumpMsct
1202  *
1203  * PARAMETERS:  Table               - A MSCT table
1204  *
1205  * RETURN:      None
1206  *
1207  * DESCRIPTION: Format the contents of a MSCT
1208  *
1209  ******************************************************************************/
1210 
1211 void
1212 AcpiDmDumpMsct (
1213     ACPI_TABLE_HEADER       *Table)
1214 {
1215     ACPI_STATUS             Status;
1216     UINT32                  Offset = sizeof (ACPI_TABLE_MSCT);
1217     ACPI_MSCT_PROXIMITY     *SubTable;
1218 
1219 
1220     /* Main table */
1221 
1222     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
1223     if (ACPI_FAILURE (Status))
1224     {
1225         return;
1226     }
1227 
1228     /* Sub-tables */
1229 
1230     SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
1231     while (Offset < Table->Length)
1232     {
1233         /* Common sub-table header */
1234 
1235         AcpiOsPrintf ("\n");
1236         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1237                     sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
1238         if (ACPI_FAILURE (Status))
1239         {
1240             return;
1241         }
1242 
1243         /* Point to next sub-table */
1244 
1245         Offset += sizeof (ACPI_MSCT_PROXIMITY);
1246         SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
1247     }
1248 }
1249 
1250 
1251 /*******************************************************************************
1252  *
1253  * FUNCTION:    AcpiDmDumpSlit
1254  *
1255  * PARAMETERS:  Table               - An SLIT
1256  *
1257  * RETURN:      None
1258  *
1259  * DESCRIPTION: Format the contents of a SLIT
1260  *
1261  ******************************************************************************/
1262 
1263 void
1264 AcpiDmDumpSlit (
1265     ACPI_TABLE_HEADER       *Table)
1266 {
1267     ACPI_STATUS             Status;
1268     UINT32                  Offset;
1269     UINT8                   *Row;
1270     UINT32                  Localities;
1271     UINT32                  i;
1272     UINT32                  j;
1273 
1274 
1275     /* Main table */
1276 
1277     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
1278     if (ACPI_FAILURE (Status))
1279     {
1280         return;
1281     }
1282 
1283     /* Display the Locality NxN Matrix */
1284 
1285     Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
1286     Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
1287     Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
1288 
1289     for (i = 0; i < Localities; i++)
1290     {
1291         /* Display one row of the matrix */
1292 
1293         AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
1294         for  (j = 0; j < Localities; j++)
1295         {
1296             /* Check for beyond EOT */
1297 
1298             if (Offset >= Table->Length)
1299             {
1300                 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
1301                 return;
1302             }
1303 
1304             AcpiOsPrintf ("%2.2X ", Row[j]);
1305             Offset++;
1306 
1307             /* Display up to 16 bytes per output row */
1308 
1309             if (j && (((j+1) % 16) == 0) && ((j+1) < Localities))
1310             {
1311                 AcpiOsPrintf ("\n");
1312                 AcpiDmLineHeader (Offset, 0, "");
1313             }
1314         }
1315 
1316         /* Point to next row */
1317 
1318         AcpiOsPrintf ("\n");
1319         Row += Localities;
1320     }
1321 }
1322 
1323 
1324 /*******************************************************************************
1325  *
1326  * FUNCTION:    AcpiDmDumpSrat
1327  *
1328  * PARAMETERS:  Table               - A SRAT table
1329  *
1330  * RETURN:      None
1331  *
1332  * DESCRIPTION: Format the contents of a SRAT
1333  *
1334  ******************************************************************************/
1335 
1336 void
1337 AcpiDmDumpSrat (
1338     ACPI_TABLE_HEADER       *Table)
1339 {
1340     ACPI_STATUS             Status;
1341     UINT32                  Offset = sizeof (ACPI_TABLE_SRAT);
1342     ACPI_SUBTABLE_HEADER    *SubTable;
1343     ACPI_DMTABLE_INFO       *InfoTable;
1344 
1345 
1346     /* Main table */
1347 
1348     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
1349     if (ACPI_FAILURE (Status))
1350     {
1351         return;
1352     }
1353 
1354     /* Sub-tables */
1355 
1356     SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
1357     while (Offset < Table->Length)
1358     {
1359         /* Common sub-table header */
1360 
1361         AcpiOsPrintf ("\n");
1362         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1363                     SubTable->Length, AcpiDmTableInfoSratHdr);
1364         if (ACPI_FAILURE (Status))
1365         {
1366             return;
1367         }
1368 
1369         switch (SubTable->Type)
1370         {
1371         case ACPI_SRAT_TYPE_CPU_AFFINITY:
1372             InfoTable = AcpiDmTableInfoSrat0;
1373             break;
1374         case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1375             InfoTable = AcpiDmTableInfoSrat1;
1376             break;
1377         case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1378             InfoTable = AcpiDmTableInfoSrat2;
1379             break;
1380         default:
1381             AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type);
1382 
1383             /* Attempt to continue */
1384 
1385             if (!SubTable->Length)
1386             {
1387                 AcpiOsPrintf ("Invalid zero length subtable\n");
1388                 return;
1389             }
1390             goto NextSubTable;
1391         }
1392 
1393         AcpiOsPrintf ("\n");
1394         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1395                     SubTable->Length, InfoTable);
1396         if (ACPI_FAILURE (Status))
1397         {
1398             return;
1399         }
1400 
1401 NextSubTable:
1402         /* Point to next sub-table */
1403 
1404         Offset += SubTable->Length;
1405         SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
1406     }
1407 }
1408 
1409 
1410 /*******************************************************************************
1411  *
1412  * FUNCTION:    AcpiDmDumpWdat
1413  *
1414  * PARAMETERS:  Table               - A WDAT table
1415  *
1416  * RETURN:      None
1417  *
1418  * DESCRIPTION: Format the contents of a WDAT
1419  *
1420  ******************************************************************************/
1421 
1422 void
1423 AcpiDmDumpWdat (
1424     ACPI_TABLE_HEADER       *Table)
1425 {
1426     ACPI_STATUS             Status;
1427     UINT32                  Offset = sizeof (ACPI_TABLE_WDAT);
1428     ACPI_WDAT_ENTRY         *SubTable;
1429 
1430 
1431     /* Main table */
1432 
1433     Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
1434     if (ACPI_FAILURE (Status))
1435     {
1436         return;
1437     }
1438 
1439     /* Sub-tables */
1440 
1441     SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
1442     while (Offset < Table->Length)
1443     {
1444         /* Common sub-table header */
1445 
1446         AcpiOsPrintf ("\n");
1447         Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1448                     sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
1449         if (ACPI_FAILURE (Status))
1450         {
1451             return;
1452         }
1453 
1454         /* Point to next sub-table */
1455 
1456         Offset += sizeof (ACPI_WDAT_ENTRY);
1457         SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
1458     }
1459 }
1460