dmtbdump.c revision 1.1 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 "acpi.h"
117 #include "accommon.h"
118 #include "acdisasm.h"
119 #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 %u 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