dmtbdump.c revision 1.3 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2015, 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
63 /*******************************************************************************
64 *
65 * FUNCTION: AcpiDmDumpBuffer
66 *
67 * PARAMETERS: Table - ACPI Table or subtable
68 * BufferOffset - Offset of buffer from Table above
69 * Length - Length of the buffer
70 * AbsoluteOffset - Offset of buffer in the main ACPI table
71 * Header - Name of the buffer field (printed on the
72 * first line only.)
73 *
74 * RETURN: None
75 *
76 * DESCRIPTION: Format the contents of an arbitrary length data buffer (in the
77 * disassembler output format.)
78 *
79 ******************************************************************************/
80
81 void
82 AcpiDmDumpBuffer (
83 void *Table,
84 UINT32 BufferOffset,
85 UINT32 Length,
86 UINT32 AbsoluteOffset,
87 char *Header)
88 {
89 UINT8 *Buffer;
90 UINT32 i;
91
92
93 if (!Length)
94 {
95 return;
96 }
97
98 Buffer = ACPI_CAST_PTR (UINT8, Table) + BufferOffset;
99 i = 0;
100
101 while (i < Length)
102 {
103 if (!(i % 16))
104 {
105 /* Insert a backslash - line continuation character */
106
107 if (Length > 16)
108 {
109 AcpiOsPrintf ("\\\n ");
110 }
111 }
112
113 AcpiOsPrintf ("%.02X ", *Buffer);
114 i++;
115 Buffer++;
116 AbsoluteOffset++;
117 }
118
119 AcpiOsPrintf ("\n");
120 }
121
122
123 /*******************************************************************************
124 *
125 * FUNCTION: AcpiDmDumpUnicode
126 *
127 * PARAMETERS: Table - ACPI Table or subtable
128 * BufferOffset - Offset of buffer from Table above
129 * ByteLength - Length of the buffer
130 *
131 * RETURN: None
132 *
133 * DESCRIPTION: Validate and dump the contents of a buffer that contains
134 * unicode data. The output is a standard ASCII string. If it
135 * appears that the data is not unicode, the buffer is dumped
136 * as hex characters.
137 *
138 ******************************************************************************/
139
140 void
141 AcpiDmDumpUnicode (
142 void *Table,
143 UINT32 BufferOffset,
144 UINT32 ByteLength)
145 {
146 UINT8 *Buffer;
147 UINT32 Length;
148 UINT32 i;
149
150
151 Buffer = ((UINT8 *) Table) + BufferOffset;
152 Length = ByteLength - 2; /* Last two bytes are the null terminator */
153
154 /* Ensure all low bytes are entirely printable ASCII */
155
156 for (i = 0; i < Length; i += 2)
157 {
158 if (!isprint (Buffer[i]))
159 {
160 goto DumpRawBuffer;
161 }
162 }
163
164 /* Ensure all high bytes are zero */
165
166 for (i = 1; i < Length; i += 2)
167 {
168 if (Buffer[i])
169 {
170 goto DumpRawBuffer;
171 }
172 }
173
174 /* Dump the buffer as a normal string */
175
176 AcpiOsPrintf ("\"");
177 for (i = 0; i < Length; i += 2)
178 {
179 AcpiOsPrintf ("%c", Buffer[i]);
180 }
181 AcpiOsPrintf ("\"\n");
182 return;
183
184 DumpRawBuffer:
185 AcpiDmDumpBuffer (Table, BufferOffset, ByteLength,
186 BufferOffset, NULL);
187 AcpiOsPrintf ("\n");
188 }
189
190
191 /*******************************************************************************
192 *
193 * FUNCTION: AcpiDmDumpRsdp
194 *
195 * PARAMETERS: Table - A RSDP
196 *
197 * RETURN: Length of the table (there is not always a length field,
198 * use revision or length if available (ACPI 2.0+))
199 *
200 * DESCRIPTION: Format the contents of a RSDP
201 *
202 ******************************************************************************/
203
204 UINT32
205 AcpiDmDumpRsdp (
206 ACPI_TABLE_HEADER *Table)
207 {
208 ACPI_TABLE_RSDP *Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table);
209 UINT32 Length = sizeof (ACPI_RSDP_COMMON);
210 UINT8 Checksum;
211 ACPI_STATUS Status;
212
213
214 /* Dump the common ACPI 1.0 portion */
215
216 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
217 if (ACPI_FAILURE (Status))
218 {
219 return (Length);
220 }
221
222 /* Validate the first checksum */
223
224 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON),
225 Rsdp->Checksum);
226 if (Checksum != Rsdp->Checksum)
227 {
228 AcpiOsPrintf ("/* Incorrect Checksum above, should be 0x%2.2X */\n",
229 Checksum);
230 }
231
232 /* The RSDP for ACPI 2.0+ contains more data and has a Length field */
233
234 if (Rsdp->Revision > 0)
235 {
236 Length = Rsdp->Length;
237 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
238 if (ACPI_FAILURE (Status))
239 {
240 return (Length);
241 }
242
243 /* Validate the extended checksum over entire RSDP */
244
245 Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP),
246 Rsdp->ExtendedChecksum);
247 if (Checksum != Rsdp->ExtendedChecksum)
248 {
249 AcpiOsPrintf (
250 "/* Incorrect Extended Checksum above, should be 0x%2.2X */\n",
251 Checksum);
252 }
253 }
254
255 return (Length);
256 }
257
258
259 /*******************************************************************************
260 *
261 * FUNCTION: AcpiDmDumpRsdt
262 *
263 * PARAMETERS: Table - A RSDT
264 *
265 * RETURN: None
266 *
267 * DESCRIPTION: Format the contents of a RSDT
268 *
269 ******************************************************************************/
270
271 void
272 AcpiDmDumpRsdt (
273 ACPI_TABLE_HEADER *Table)
274 {
275 UINT32 *Array;
276 UINT32 Entries;
277 UINT32 Offset;
278 UINT32 i;
279
280
281 /* Point to start of table pointer array */
282
283 Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
284 Offset = sizeof (ACPI_TABLE_HEADER);
285
286 /* RSDT uses 32-bit pointers */
287
288 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
289
290 for (i = 0; i < Entries; i++)
291 {
292 AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
293 AcpiOsPrintf ("%8.8X\n", Array[i]);
294 Offset += sizeof (UINT32);
295 }
296 }
297
298
299 /*******************************************************************************
300 *
301 * FUNCTION: AcpiDmDumpXsdt
302 *
303 * PARAMETERS: Table - A XSDT
304 *
305 * RETURN: None
306 *
307 * DESCRIPTION: Format the contents of a XSDT
308 *
309 ******************************************************************************/
310
311 void
312 AcpiDmDumpXsdt (
313 ACPI_TABLE_HEADER *Table)
314 {
315 UINT64 *Array;
316 UINT32 Entries;
317 UINT32 Offset;
318 UINT32 i;
319
320
321 /* Point to start of table pointer array */
322
323 Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
324 Offset = sizeof (ACPI_TABLE_HEADER);
325
326 /* XSDT uses 64-bit pointers */
327
328 Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
329
330 for (i = 0; i < Entries; i++)
331 {
332 AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
333 AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
334 Offset += sizeof (UINT64);
335 }
336 }
337
338
339 /*******************************************************************************
340 *
341 * FUNCTION: AcpiDmDumpFadt
342 *
343 * PARAMETERS: Table - A FADT
344 *
345 * RETURN: None
346 *
347 * DESCRIPTION: Format the contents of a FADT
348 *
349 * NOTE: We cannot depend on the FADT version to indicate the actual
350 * contents of the FADT because of BIOS bugs. The table length
351 * is the only reliable indicator.
352 *
353 ******************************************************************************/
354
355 void
356 AcpiDmDumpFadt (
357 ACPI_TABLE_HEADER *Table)
358 {
359 ACPI_STATUS Status;
360
361
362 /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
363
364 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
365 if (ACPI_FAILURE (Status))
366 {
367 return;
368 }
369
370 /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
371
372 if ((Table->Length > ACPI_FADT_V1_SIZE) &&
373 (Table->Length <= ACPI_FADT_V2_SIZE))
374 {
375 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
376 if (ACPI_FAILURE (Status))
377 {
378 return;
379 }
380 }
381
382 /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
383
384 else if (Table->Length > ACPI_FADT_V2_SIZE)
385 {
386 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt3);
387 if (ACPI_FAILURE (Status))
388 {
389 return;
390 }
391
392 /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
393
394 if (Table->Length > ACPI_FADT_V3_SIZE)
395 {
396 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt5);
397 if (ACPI_FAILURE (Status))
398 {
399 return;
400 }
401 }
402
403 /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
404
405 if (Table->Length > ACPI_FADT_V3_SIZE)
406 {
407 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt6);
408 if (ACPI_FAILURE (Status))
409 {
410 return;
411 }
412 }
413 }
414
415 /* Validate various fields in the FADT, including length */
416
417 AcpiTbCreateLocalFadt (Table, Table->Length);
418
419 /* Validate FADT length against the revision */
420
421 AcpiDmValidateFadtLength (Table->Revision, Table->Length);
422 }
423
424
425 /*******************************************************************************
426 *
427 * FUNCTION: AcpiDmValidateFadtLength
428 *
429 * PARAMETERS: Revision - FADT revision (Header->Revision)
430 * Length - FADT length (Header->Length
431 *
432 * RETURN: None
433 *
434 * DESCRIPTION: Check the FADT revision against the expected table length for
435 * that revision. Issue a warning if the length is not what was
436 * expected. This seems to be such a common BIOS bug that the
437 * FADT revision has been rendered virtually meaningless.
438 *
439 ******************************************************************************/
440
441 static void
442 AcpiDmValidateFadtLength (
443 UINT32 Revision,
444 UINT32 Length)
445 {
446 UINT32 ExpectedLength;
447
448
449 switch (Revision)
450 {
451 case 0:
452
453 AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n");
454 return;
455
456 case 1:
457
458 ExpectedLength = ACPI_FADT_V1_SIZE;
459 break;
460
461 case 2:
462
463 ExpectedLength = ACPI_FADT_V2_SIZE;
464 break;
465
466 case 3:
467 case 4:
468
469 ExpectedLength = ACPI_FADT_V3_SIZE;
470 break;
471
472 case 5:
473
474 ExpectedLength = ACPI_FADT_V5_SIZE;
475 break;
476
477 default:
478
479 return;
480 }
481
482 if (Length == ExpectedLength)
483 {
484 return;
485 }
486
487 AcpiOsPrintf (
488 "\n// ACPI Warning: FADT revision %X does not match length: found %X expected %X\n",
489 Revision, Length, ExpectedLength);
490 }
491
492
493 /*******************************************************************************
494 *
495 * FUNCTION: AcpiDmDumpAsf
496 *
497 * PARAMETERS: Table - A ASF table
498 *
499 * RETURN: None
500 *
501 * DESCRIPTION: Format the contents of a ASF table
502 *
503 ******************************************************************************/
504
505 void
506 AcpiDmDumpAsf (
507 ACPI_TABLE_HEADER *Table)
508 {
509 ACPI_STATUS Status;
510 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
511 ACPI_ASF_INFO *SubTable;
512 ACPI_DMTABLE_INFO *InfoTable;
513 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
514 UINT8 *DataTable = NULL;
515 UINT32 DataCount = 0;
516 UINT32 DataLength = 0;
517 UINT32 DataOffset = 0;
518 UINT32 i;
519 UINT8 Type;
520
521
522 /* No main table, only subtables */
523
524 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
525 while (Offset < Table->Length)
526 {
527 /* Common subtable header */
528
529 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
530 SubTable->Header.Length, AcpiDmTableInfoAsfHdr);
531 if (ACPI_FAILURE (Status))
532 {
533 return;
534 }
535
536 /* The actual type is the lower 7 bits of Type */
537
538 Type = (UINT8) (SubTable->Header.Type & 0x7F);
539
540 switch (Type)
541 {
542 case ACPI_ASF_TYPE_INFO:
543
544 InfoTable = AcpiDmTableInfoAsf0;
545 break;
546
547 case ACPI_ASF_TYPE_ALERT:
548
549 InfoTable = AcpiDmTableInfoAsf1;
550 DataInfoTable = AcpiDmTableInfoAsf1a;
551 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
552 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts;
553 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength;
554 DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
555 break;
556
557 case ACPI_ASF_TYPE_CONTROL:
558
559 InfoTable = AcpiDmTableInfoAsf2;
560 DataInfoTable = AcpiDmTableInfoAsf2a;
561 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
562 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls;
563 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength;
564 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
565 break;
566
567 case ACPI_ASF_TYPE_BOOT:
568
569 InfoTable = AcpiDmTableInfoAsf3;
570 break;
571
572 case ACPI_ASF_TYPE_ADDRESS:
573
574 InfoTable = AcpiDmTableInfoAsf4;
575 DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
576 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices;
577 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
578 break;
579
580 default:
581
582 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", SubTable->Header.Type);
583 return;
584 }
585
586 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
587 SubTable->Header.Length, InfoTable);
588 if (ACPI_FAILURE (Status))
589 {
590 return;
591 }
592
593 /* Dump variable-length extra data */
594
595 switch (Type)
596 {
597 case ACPI_ASF_TYPE_ALERT:
598 case ACPI_ASF_TYPE_CONTROL:
599
600 for (i = 0; i < DataCount; i++)
601 {
602 AcpiOsPrintf ("\n");
603 Status = AcpiDmDumpTable (Table->Length, DataOffset,
604 DataTable, DataLength, DataInfoTable);
605 if (ACPI_FAILURE (Status))
606 {
607 return;
608 }
609
610 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
611 DataOffset += DataLength;
612 }
613 break;
614
615 case ACPI_ASF_TYPE_ADDRESS:
616
617 for (i = 0; i < DataLength; i++)
618 {
619 if (!(i % 16))
620 {
621 AcpiDmLineHeader (DataOffset, 1, "Addresses");
622 }
623
624 AcpiOsPrintf ("%2.2X ", *DataTable);
625 DataTable++;
626 DataOffset++;
627 if (DataOffset > Table->Length)
628 {
629 AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure! (ASF! table)\n");
630 return;
631 }
632 }
633
634 AcpiOsPrintf ("\n");
635 break;
636
637 default:
638
639 break;
640 }
641
642 AcpiOsPrintf ("\n");
643
644 /* Point to next subtable */
645
646 if (!SubTable->Header.Length)
647 {
648 AcpiOsPrintf ("Invalid zero subtable header length\n");
649 return;
650 }
651
652 Offset += SubTable->Header.Length;
653 SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
654 }
655 }
656
657
658 /*******************************************************************************
659 *
660 * FUNCTION: AcpiDmDumpCpep
661 *
662 * PARAMETERS: Table - A CPEP table
663 *
664 * RETURN: None
665 *
666 * DESCRIPTION: Format the contents of a CPEP. This table type consists
667 * of an open-ended number of subtables.
668 *
669 ******************************************************************************/
670
671 void
672 AcpiDmDumpCpep (
673 ACPI_TABLE_HEADER *Table)
674 {
675 ACPI_STATUS Status;
676 ACPI_CPEP_POLLING *SubTable;
677 UINT32 Length = Table->Length;
678 UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
679
680
681 /* Main table */
682
683 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
684 if (ACPI_FAILURE (Status))
685 {
686 return;
687 }
688
689 /* Subtables */
690
691 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
692 while (Offset < Table->Length)
693 {
694 AcpiOsPrintf ("\n");
695 Status = AcpiDmDumpTable (Length, Offset, SubTable,
696 SubTable->Header.Length, AcpiDmTableInfoCpep0);
697 if (ACPI_FAILURE (Status))
698 {
699 return;
700 }
701
702 /* Point to next subtable */
703
704 Offset += SubTable->Header.Length;
705 SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable,
706 SubTable->Header.Length);
707 }
708 }
709
710
711 /*******************************************************************************
712 *
713 * FUNCTION: AcpiDmDumpCsrt
714 *
715 * PARAMETERS: Table - A CSRT table
716 *
717 * RETURN: None
718 *
719 * DESCRIPTION: Format the contents of a CSRT. This table type consists
720 * of an open-ended number of subtables.
721 *
722 ******************************************************************************/
723
724 void
725 AcpiDmDumpCsrt (
726 ACPI_TABLE_HEADER *Table)
727 {
728 ACPI_STATUS Status;
729 ACPI_CSRT_GROUP *SubTable;
730 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
731 ACPI_CSRT_DESCRIPTOR *SubSubTable;
732 UINT32 Length = Table->Length;
733 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
734 UINT32 SubOffset;
735 UINT32 SubSubOffset;
736 UINT32 InfoLength;
737
738
739 /* The main table only contains the ACPI header, thus already handled */
740
741 /* Subtables (Resource Groups) */
742
743 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
744 while (Offset < Table->Length)
745 {
746 /* Resource group subtable */
747
748 AcpiOsPrintf ("\n");
749 Status = AcpiDmDumpTable (Length, Offset, SubTable,
750 SubTable->Length, AcpiDmTableInfoCsrt0);
751 if (ACPI_FAILURE (Status))
752 {
753 return;
754 }
755
756 /* Shared info subtable (One per resource group) */
757
758 SubOffset = sizeof (ACPI_CSRT_GROUP);
759 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
760 Offset + SubOffset);
761
762 AcpiOsPrintf ("\n");
763 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
764 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
765 if (ACPI_FAILURE (Status))
766 {
767 return;
768 }
769
770 SubOffset += SubTable->SharedInfoLength;
771
772 /* Sub-Subtables (Resource Descriptors) */
773
774 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
775 Offset + SubOffset);
776
777 while ((SubOffset < SubTable->Length) &&
778 ((Offset + SubOffset) < Table->Length))
779 {
780 AcpiOsPrintf ("\n");
781 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable,
782 SubSubTable->Length, AcpiDmTableInfoCsrt2);
783 if (ACPI_FAILURE (Status))
784 {
785 return;
786 }
787
788 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
789
790 /* Resource-specific info buffer */
791
792 InfoLength = SubSubTable->Length - SubSubOffset;
793 if (InfoLength)
794 {
795 Status = AcpiDmDumpTable (Length,
796 Offset + SubOffset + SubSubOffset, Table,
797 InfoLength, AcpiDmTableInfoCsrt2a);
798 if (ACPI_FAILURE (Status))
799 {
800 return;
801 }
802 SubSubOffset += InfoLength;
803 }
804
805 /* Point to next sub-subtable */
806
807 SubOffset += SubSubTable->Length;
808 SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable,
809 SubSubTable->Length);
810 }
811
812 /* Point to next subtable */
813
814 Offset += SubTable->Length;
815 SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable,
816 SubTable->Length);
817 }
818 }
819
820
821 /*******************************************************************************
822 *
823 * FUNCTION: AcpiDmDumpDbg2
824 *
825 * PARAMETERS: Table - A DBG2 table
826 *
827 * RETURN: None
828 *
829 * DESCRIPTION: Format the contents of a DBG2. This table type consists
830 * of an open-ended number of subtables.
831 *
832 ******************************************************************************/
833
834 void
835 AcpiDmDumpDbg2 (
836 ACPI_TABLE_HEADER *Table)
837 {
838 ACPI_STATUS Status;
839 ACPI_DBG2_DEVICE *SubTable;
840 UINT32 Length = Table->Length;
841 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
842 UINT32 i;
843 UINT32 ArrayOffset;
844 UINT32 AbsoluteOffset;
845 UINT8 *Array;
846
847
848 /* Main table */
849
850 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
851 if (ACPI_FAILURE (Status))
852 {
853 return;
854 }
855
856 /* Subtables */
857
858 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
859 while (Offset < Table->Length)
860 {
861 AcpiOsPrintf ("\n");
862 Status = AcpiDmDumpTable (Length, Offset, SubTable,
863 SubTable->Length, AcpiDmTableInfoDbg2Device);
864 if (ACPI_FAILURE (Status))
865 {
866 return;
867 }
868
869 /* Dump the BaseAddress array */
870
871 for (i = 0; i < SubTable->RegisterCount; i++)
872 {
873 ArrayOffset = SubTable->BaseAddressOffset +
874 (sizeof (ACPI_GENERIC_ADDRESS) * i);
875 AbsoluteOffset = Offset + ArrayOffset;
876 Array = (UINT8 *) SubTable + ArrayOffset;
877
878 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
879 SubTable->Length, AcpiDmTableInfoDbg2Addr);
880 if (ACPI_FAILURE (Status))
881 {
882 return;
883 }
884 }
885
886 /* Dump the AddressSize array */
887
888 for (i = 0; i < SubTable->RegisterCount; i++)
889 {
890 ArrayOffset = SubTable->AddressSizeOffset +
891 (sizeof (UINT32) * i);
892 AbsoluteOffset = Offset + ArrayOffset;
893 Array = (UINT8 *) SubTable + ArrayOffset;
894
895 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
896 SubTable->Length, AcpiDmTableInfoDbg2Size);
897 if (ACPI_FAILURE (Status))
898 {
899 return;
900 }
901 }
902
903 /* Dump the Namestring (required) */
904
905 AcpiOsPrintf ("\n");
906 ArrayOffset = SubTable->NamepathOffset;
907 AbsoluteOffset = Offset + ArrayOffset;
908 Array = (UINT8 *) SubTable + ArrayOffset;
909
910 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
911 SubTable->Length, AcpiDmTableInfoDbg2Name);
912 if (ACPI_FAILURE (Status))
913 {
914 return;
915 }
916
917 /* Dump the OemData (optional) */
918
919 if (SubTable->OemDataOffset)
920 {
921 Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset,
922 Table, SubTable->OemDataLength,
923 AcpiDmTableInfoDbg2OemData);
924 if (ACPI_FAILURE (Status))
925 {
926 return;
927 }
928 }
929
930 /* Point to next subtable */
931
932 Offset += SubTable->Length;
933 SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable,
934 SubTable->Length);
935 }
936 }
937
938
939 /*******************************************************************************
940 *
941 * FUNCTION: AcpiDmDumpDmar
942 *
943 * PARAMETERS: Table - A DMAR table
944 *
945 * RETURN: None
946 *
947 * DESCRIPTION: Format the contents of a DMAR. This table type consists
948 * of an open-ended number of subtables.
949 *
950 ******************************************************************************/
951
952 void
953 AcpiDmDumpDmar (
954 ACPI_TABLE_HEADER *Table)
955 {
956 ACPI_STATUS Status;
957 ACPI_DMAR_HEADER *SubTable;
958 UINT32 Length = Table->Length;
959 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
960 ACPI_DMTABLE_INFO *InfoTable;
961 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
962 UINT32 ScopeOffset;
963 UINT8 *PciPath;
964 UINT32 PathOffset;
965
966
967 /* Main table */
968
969 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
970 if (ACPI_FAILURE (Status))
971 {
972 return;
973 }
974
975 /* Subtables */
976
977 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
978 while (Offset < Table->Length)
979 {
980 /* Common subtable header */
981
982 AcpiOsPrintf ("\n");
983 Status = AcpiDmDumpTable (Length, Offset, SubTable,
984 SubTable->Length, AcpiDmTableInfoDmarHdr);
985 if (ACPI_FAILURE (Status))
986 {
987 return;
988 }
989 AcpiOsPrintf ("\n");
990
991 switch (SubTable->Type)
992 {
993 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
994
995 InfoTable = AcpiDmTableInfoDmar0;
996 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
997 break;
998
999 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
1000
1001 InfoTable = AcpiDmTableInfoDmar1;
1002 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
1003 break;
1004
1005 case ACPI_DMAR_TYPE_ROOT_ATS:
1006
1007 InfoTable = AcpiDmTableInfoDmar2;
1008 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1009 break;
1010
1011 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1012
1013 InfoTable = AcpiDmTableInfoDmar3;
1014 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1015 break;
1016
1017 case ACPI_DMAR_TYPE_NAMESPACE:
1018
1019 InfoTable = AcpiDmTableInfoDmar4;
1020 ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1021 break;
1022
1023 default:
1024
1025 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", SubTable->Type);
1026 return;
1027 }
1028
1029 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1030 SubTable->Length, InfoTable);
1031 if (ACPI_FAILURE (Status))
1032 {
1033 return;
1034 }
1035
1036 /*
1037 * Dump the optional device scope entries
1038 */
1039 if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1040 (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1041 {
1042 /* These types do not support device scopes */
1043
1044 goto NextSubtable;
1045 }
1046
1047 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
1048 while (ScopeOffset < SubTable->Length)
1049 {
1050 AcpiOsPrintf ("\n");
1051 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1052 ScopeTable->Length, AcpiDmTableInfoDmarScope);
1053 if (ACPI_FAILURE (Status))
1054 {
1055 return;
1056 }
1057 AcpiOsPrintf ("\n");
1058
1059 /* Dump the PCI Path entries for this device scope */
1060
1061 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1062
1063 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1064 sizeof (ACPI_DMAR_DEVICE_SCOPE));
1065
1066 while (PathOffset < ScopeTable->Length)
1067 {
1068 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
1069 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1070
1071 /* Point to next PCI Path entry */
1072
1073 PathOffset += 2;
1074 PciPath += 2;
1075 AcpiOsPrintf ("\n");
1076 }
1077
1078 /* Point to next device scope entry */
1079
1080 ScopeOffset += ScopeTable->Length;
1081 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1082 ScopeTable, ScopeTable->Length);
1083 }
1084
1085 NextSubtable:
1086 /* Point to next subtable */
1087
1088 Offset += SubTable->Length;
1089 SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
1090 }
1091 }
1092
1093
1094 /*******************************************************************************
1095 *
1096 * FUNCTION: AcpiDmDumpDrtm
1097 *
1098 * PARAMETERS: Table - A DRTM table
1099 *
1100 * RETURN: None
1101 *
1102 * DESCRIPTION: Format the contents of a DRTM.
1103 *
1104 ******************************************************************************/
1105
1106 void
1107 AcpiDmDumpDrtm (
1108 ACPI_TABLE_HEADER *Table)
1109 {
1110 ACPI_STATUS Status;
1111 UINT32 Offset;
1112 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
1113 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1114 ACPI_DRTM_DPS_ID *DrtmDps;
1115 UINT32 Count;
1116
1117
1118 /* Main table */
1119
1120 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1121 AcpiDmTableInfoDrtm);
1122 if (ACPI_FAILURE (Status))
1123 {
1124 return;
1125 }
1126
1127 Offset = sizeof (ACPI_TABLE_DRTM);
1128
1129 /* Sub-tables */
1130
1131 /* Dump ValidatedTable length */
1132
1133 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1134 AcpiOsPrintf ("\n");
1135 Status = AcpiDmDumpTable (Table->Length, Offset,
1136 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1137 AcpiDmTableInfoDrtm0);
1138 if (ACPI_FAILURE (Status))
1139 {
1140 return;
1141 }
1142 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1143
1144 /* Dump Validated table addresses */
1145
1146 Count = 0;
1147 while ((Offset < Table->Length) &&
1148 (DrtmVtl->ValidatedTableCount > Count))
1149 {
1150 Status = AcpiDmDumpTable (Table->Length, Offset,
1151 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1152 AcpiDmTableInfoDrtm0a);
1153 if (ACPI_FAILURE (Status))
1154 {
1155 return;
1156 }
1157 Offset += sizeof (UINT64);
1158 Count++;
1159 }
1160
1161 /* Dump ResourceList length */
1162
1163 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1164 AcpiOsPrintf ("\n");
1165 Status = AcpiDmDumpTable (Table->Length, Offset,
1166 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1167 AcpiDmTableInfoDrtm1);
1168 if (ACPI_FAILURE (Status))
1169 {
1170 return;
1171 }
1172
1173 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1174
1175 /* Dump the Resource List */
1176
1177 Count = 0;
1178 while ((Offset < Table->Length) &&
1179 (DrtmRl->ResourceCount > Count))
1180 {
1181 Status = AcpiDmDumpTable (Table->Length, Offset,
1182 ACPI_ADD_PTR (void, Table, Offset),
1183 sizeof (ACPI_DRTM_RESOURCE),
1184 AcpiDmTableInfoDrtm1a);
1185 if (ACPI_FAILURE (Status))
1186 {
1187 return;
1188 }
1189
1190 Offset += sizeof (ACPI_DRTM_RESOURCE);
1191 Count++;
1192 }
1193
1194 /* Dump DPS */
1195
1196 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1197 AcpiOsPrintf ("\n");
1198 (void) AcpiDmDumpTable (Table->Length, Offset,
1199 DrtmDps, sizeof (ACPI_DRTM_DPS_ID),
1200 AcpiDmTableInfoDrtm2);
1201 }
1202
1203
1204 /*******************************************************************************
1205 *
1206 * FUNCTION: AcpiDmDumpEinj
1207 *
1208 * PARAMETERS: Table - A EINJ table
1209 *
1210 * RETURN: None
1211 *
1212 * DESCRIPTION: Format the contents of a EINJ. This table type consists
1213 * of an open-ended number of subtables.
1214 *
1215 ******************************************************************************/
1216
1217 void
1218 AcpiDmDumpEinj (
1219 ACPI_TABLE_HEADER *Table)
1220 {
1221 ACPI_STATUS Status;
1222 ACPI_WHEA_HEADER *SubTable;
1223 UINT32 Length = Table->Length;
1224 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
1225
1226
1227 /* Main table */
1228
1229 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1230 if (ACPI_FAILURE (Status))
1231 {
1232 return;
1233 }
1234
1235 /* Subtables */
1236
1237 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1238 while (Offset < Table->Length)
1239 {
1240 AcpiOsPrintf ("\n");
1241 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1242 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1243 if (ACPI_FAILURE (Status))
1244 {
1245 return;
1246 }
1247
1248 /* Point to next subtable (each subtable is of fixed length) */
1249
1250 Offset += sizeof (ACPI_WHEA_HEADER);
1251 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1252 sizeof (ACPI_WHEA_HEADER));
1253 }
1254 }
1255
1256
1257 /*******************************************************************************
1258 *
1259 * FUNCTION: AcpiDmDumpErst
1260 *
1261 * PARAMETERS: Table - A ERST table
1262 *
1263 * RETURN: None
1264 *
1265 * DESCRIPTION: Format the contents of a ERST. This table type consists
1266 * of an open-ended number of subtables.
1267 *
1268 ******************************************************************************/
1269
1270 void
1271 AcpiDmDumpErst (
1272 ACPI_TABLE_HEADER *Table)
1273 {
1274 ACPI_STATUS Status;
1275 ACPI_WHEA_HEADER *SubTable;
1276 UINT32 Length = Table->Length;
1277 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
1278
1279
1280 /* Main table */
1281
1282 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1283 if (ACPI_FAILURE (Status))
1284 {
1285 return;
1286 }
1287
1288 /* Subtables */
1289
1290 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1291 while (Offset < Table->Length)
1292 {
1293 AcpiOsPrintf ("\n");
1294 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1295 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1296 if (ACPI_FAILURE (Status))
1297 {
1298 return;
1299 }
1300
1301 /* Point to next subtable (each subtable is of fixed length) */
1302
1303 Offset += sizeof (ACPI_WHEA_HEADER);
1304 SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable,
1305 sizeof (ACPI_WHEA_HEADER));
1306 }
1307 }
1308
1309
1310 /*******************************************************************************
1311 *
1312 * FUNCTION: AcpiDmDumpFpdt
1313 *
1314 * PARAMETERS: Table - A FPDT table
1315 *
1316 * RETURN: None
1317 *
1318 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1319 * of an open-ended number of subtables.
1320 *
1321 ******************************************************************************/
1322
1323 void
1324 AcpiDmDumpFpdt (
1325 ACPI_TABLE_HEADER *Table)
1326 {
1327 ACPI_STATUS Status;
1328 ACPI_FPDT_HEADER *SubTable;
1329 UINT32 Length = Table->Length;
1330 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1331 ACPI_DMTABLE_INFO *InfoTable;
1332
1333
1334 /* There is no main table (other than the standard ACPI header) */
1335
1336 /* Subtables */
1337
1338 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1339 while (Offset < Table->Length)
1340 {
1341 /* Common subtable header */
1342
1343 AcpiOsPrintf ("\n");
1344 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1345 SubTable->Length, AcpiDmTableInfoFpdtHdr);
1346 if (ACPI_FAILURE (Status))
1347 {
1348 return;
1349 }
1350
1351 switch (SubTable->Type)
1352 {
1353 case ACPI_FPDT_TYPE_BOOT:
1354
1355 InfoTable = AcpiDmTableInfoFpdt0;
1356 break;
1357
1358 case ACPI_FPDT_TYPE_S3PERF:
1359
1360 InfoTable = AcpiDmTableInfoFpdt1;
1361 break;
1362
1363 default:
1364
1365 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", SubTable->Type);
1366
1367 /* Attempt to continue */
1368
1369 if (!SubTable->Length)
1370 {
1371 AcpiOsPrintf ("Invalid zero length subtable\n");
1372 return;
1373 }
1374 goto NextSubTable;
1375 }
1376
1377 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1378 SubTable->Length, InfoTable);
1379 if (ACPI_FAILURE (Status))
1380 {
1381 return;
1382 }
1383
1384 NextSubTable:
1385 /* Point to next subtable */
1386
1387 Offset += SubTable->Length;
1388 SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length);
1389 }
1390 }
1391
1392
1393 /*******************************************************************************
1394 *
1395 * FUNCTION: AcpiDmDumpGtdt
1396 *
1397 * PARAMETERS: Table - A GTDT table
1398 *
1399 * RETURN: None
1400 *
1401 * DESCRIPTION: Format the contents of a GTDT. This table type consists
1402 * of an open-ended number of subtables.
1403 *
1404 ******************************************************************************/
1405
1406 void
1407 AcpiDmDumpGtdt (
1408 ACPI_TABLE_HEADER *Table)
1409 {
1410 ACPI_STATUS Status;
1411 ACPI_GTDT_HEADER *SubTable;
1412 UINT32 Length = Table->Length;
1413 UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
1414 ACPI_DMTABLE_INFO *InfoTable;
1415 UINT32 SubTableLength;
1416 UINT32 GtCount;
1417 ACPI_GTDT_TIMER_ENTRY *GtxTable;
1418
1419
1420 /* Main table */
1421
1422 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1423 if (ACPI_FAILURE (Status))
1424 {
1425 return;
1426 }
1427
1428 /* Subtables */
1429
1430 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1431 while (Offset < Table->Length)
1432 {
1433 /* Common subtable header */
1434
1435 AcpiOsPrintf ("\n");
1436 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1437 SubTable->Length, AcpiDmTableInfoGtdtHdr);
1438 if (ACPI_FAILURE (Status))
1439 {
1440 return;
1441 }
1442
1443 GtCount = 0;
1444 switch (SubTable->Type)
1445 {
1446 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1447
1448 SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1449 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1450 SubTable))->TimerCount;
1451
1452 InfoTable = AcpiDmTableInfoGtdt0;
1453 break;
1454
1455 case ACPI_GTDT_TYPE_WATCHDOG:
1456
1457 SubTableLength = sizeof (ACPI_GTDT_WATCHDOG);
1458
1459 InfoTable = AcpiDmTableInfoGtdt1;
1460 break;
1461
1462 default:
1463
1464 /* Cannot continue on unknown type - no length */
1465
1466 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", SubTable->Type);
1467 return;
1468 }
1469
1470 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1471 SubTable->Length, InfoTable);
1472 if (ACPI_FAILURE (Status))
1473 {
1474 return;
1475 }
1476
1477 /* Point to end of current subtable (each subtable above is of fixed length) */
1478
1479 Offset += SubTableLength;
1480
1481 /* If there are any Gt Timer Blocks from above, dump them now */
1482
1483 if (GtCount)
1484 {
1485 GtxTable = ACPI_ADD_PTR (ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength);
1486 SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1487
1488 while (GtCount)
1489 {
1490 AcpiOsPrintf ("\n");
1491 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1492 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1493 if (ACPI_FAILURE (Status))
1494 {
1495 return;
1496 }
1497 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1498 GtxTable++;
1499 GtCount--;
1500 }
1501 }
1502
1503 /* Point to next subtable */
1504
1505 SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength);
1506 }
1507 }
1508
1509
1510 /*******************************************************************************
1511 *
1512 * FUNCTION: AcpiDmDumpHest
1513 *
1514 * PARAMETERS: Table - A HEST table
1515 *
1516 * RETURN: None
1517 *
1518 * DESCRIPTION: Format the contents of a HEST. This table type consists
1519 * of an open-ended number of subtables.
1520 *
1521 ******************************************************************************/
1522
1523 void
1524 AcpiDmDumpHest (
1525 ACPI_TABLE_HEADER *Table)
1526 {
1527 ACPI_STATUS Status;
1528 ACPI_HEST_HEADER *SubTable;
1529 UINT32 Length = Table->Length;
1530 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1531 ACPI_DMTABLE_INFO *InfoTable;
1532 UINT32 SubTableLength;
1533 UINT32 BankCount;
1534 ACPI_HEST_IA_ERROR_BANK *BankTable;
1535
1536
1537 /* Main table */
1538
1539 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1540 if (ACPI_FAILURE (Status))
1541 {
1542 return;
1543 }
1544
1545 /* Subtables */
1546
1547 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1548 while (Offset < Table->Length)
1549 {
1550 BankCount = 0;
1551 switch (SubTable->Type)
1552 {
1553 case ACPI_HEST_TYPE_IA32_CHECK:
1554
1555 InfoTable = AcpiDmTableInfoHest0;
1556 SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1557 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1558 SubTable))->NumHardwareBanks;
1559 break;
1560
1561 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1562
1563 InfoTable = AcpiDmTableInfoHest1;
1564 SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1565 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1566 SubTable))->NumHardwareBanks;
1567 break;
1568
1569 case ACPI_HEST_TYPE_IA32_NMI:
1570
1571 InfoTable = AcpiDmTableInfoHest2;
1572 SubTableLength = sizeof (ACPI_HEST_IA_NMI);
1573 break;
1574
1575 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1576
1577 InfoTable = AcpiDmTableInfoHest6;
1578 SubTableLength = sizeof (ACPI_HEST_AER_ROOT);
1579 break;
1580
1581 case ACPI_HEST_TYPE_AER_ENDPOINT:
1582
1583 InfoTable = AcpiDmTableInfoHest7;
1584 SubTableLength = sizeof (ACPI_HEST_AER);
1585 break;
1586
1587 case ACPI_HEST_TYPE_AER_BRIDGE:
1588
1589 InfoTable = AcpiDmTableInfoHest8;
1590 SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1591 break;
1592
1593 case ACPI_HEST_TYPE_GENERIC_ERROR:
1594
1595 InfoTable = AcpiDmTableInfoHest9;
1596 SubTableLength = sizeof (ACPI_HEST_GENERIC);
1597 break;
1598
1599 default:
1600
1601 /* Cannot continue on unknown type - no length */
1602
1603 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", SubTable->Type);
1604 return;
1605 }
1606
1607 AcpiOsPrintf ("\n");
1608 Status = AcpiDmDumpTable (Length, Offset, SubTable,
1609 SubTableLength, InfoTable);
1610 if (ACPI_FAILURE (Status))
1611 {
1612 return;
1613 }
1614
1615 /* Point to end of current subtable (each subtable above is of fixed length) */
1616
1617 Offset += SubTableLength;
1618
1619 /* If there are any (fixed-length) Error Banks from above, dump them now */
1620
1621 if (BankCount)
1622 {
1623 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, SubTableLength);
1624 SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1625
1626 while (BankCount)
1627 {
1628 AcpiOsPrintf ("\n");
1629 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1630 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1631 if (ACPI_FAILURE (Status))
1632 {
1633 return;
1634 }
1635 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1636 BankTable++;
1637 BankCount--;
1638 }
1639 }
1640
1641 /* Point to next subtable */
1642
1643 SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength);
1644 }
1645 }
1646
1647
1648 /*******************************************************************************
1649 *
1650 * FUNCTION: AcpiDmDumpIort
1651 *
1652 * PARAMETERS: Table - A IORT table
1653 *
1654 * RETURN: None
1655 *
1656 * DESCRIPTION: Format the contents of a IORT
1657 *
1658 ******************************************************************************/
1659
1660 void
1661 AcpiDmDumpIort (
1662 ACPI_TABLE_HEADER *Table)
1663 {
1664 ACPI_STATUS Status;
1665 ACPI_TABLE_IORT *Iort;
1666 ACPI_IORT_NODE *IortNode;
1667 ACPI_IORT_ITS_GROUP *IortItsGroup = NULL;
1668 ACPI_IORT_SMMU *IortSmmu = NULL;
1669 UINT32 Offset;
1670 UINT32 NodeOffset;
1671 UINT32 Length;
1672 ACPI_DMTABLE_INFO *InfoTable;
1673 char *String;
1674 UINT32 i;
1675
1676
1677 /* Main table */
1678
1679 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
1680 if (ACPI_FAILURE (Status))
1681 {
1682 return;
1683 }
1684
1685 Iort = ACPI_CAST_PTR (ACPI_TABLE_IORT, Table);
1686 Offset = sizeof (ACPI_TABLE_IORT);
1687
1688 /* Dump the OptionalPadding (optional) */
1689
1690 if (Iort->NodeOffset > Offset)
1691 {
1692 Status = AcpiDmDumpTable (Table->Length, Offset, Table,
1693 Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
1694 if (ACPI_FAILURE (Status))
1695 {
1696 return;
1697 }
1698 }
1699
1700 Offset = Iort->NodeOffset;
1701 while (Offset < Table->Length)
1702 {
1703 /* Common subtable header */
1704
1705 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
1706 AcpiOsPrintf ("\n");
1707 Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1708 Status = AcpiDmDumpTable (Table->Length, Offset,
1709 IortNode, Length, AcpiDmTableInfoIortHdr);
1710 if (ACPI_FAILURE (Status))
1711 {
1712 return;
1713 }
1714
1715 NodeOffset = Length;
1716
1717 switch (IortNode->Type)
1718 {
1719 case ACPI_IORT_NODE_ITS_GROUP:
1720
1721 InfoTable = AcpiDmTableInfoIort0;
1722 Length = ACPI_OFFSET (ACPI_IORT_ITS_GROUP, Identifiers);
1723 IortItsGroup = ACPI_ADD_PTR (ACPI_IORT_ITS_GROUP, IortNode, NodeOffset);
1724 break;
1725
1726 case ACPI_IORT_NODE_NAMED_COMPONENT:
1727
1728 InfoTable = AcpiDmTableInfoIort1;
1729 Length = ACPI_OFFSET (ACPI_IORT_NAMED_COMPONENT, DeviceName);
1730 String = ACPI_ADD_PTR (char, IortNode, NodeOffset + Length);
1731 Length += strlen (String) + 1;
1732 break;
1733
1734 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1735
1736 InfoTable = AcpiDmTableInfoIort2;
1737 Length = IortNode->Length - NodeOffset;
1738 break;
1739
1740 case ACPI_IORT_NODE_SMMU:
1741
1742 InfoTable = AcpiDmTableInfoIort3;
1743 Length = ACPI_OFFSET (ACPI_IORT_SMMU, Interrupts);
1744 IortSmmu = ACPI_ADD_PTR (ACPI_IORT_SMMU, IortNode, NodeOffset);
1745 break;
1746
1747 default:
1748
1749 AcpiOsPrintf ("\n**** Unknown IORT node type 0x%X\n",
1750 IortNode->Type);
1751
1752 /* Attempt to continue */
1753
1754 if (!IortNode->Length)
1755 {
1756 AcpiOsPrintf ("Invalid zero length IORT node\n");
1757 return;
1758 }
1759 goto NextSubTable;
1760 }
1761
1762 /* Dump the node subtable header */
1763
1764 AcpiOsPrintf ("\n");
1765 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1766 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1767 Length, InfoTable);
1768 if (ACPI_FAILURE (Status))
1769 {
1770 return;
1771 }
1772
1773 NodeOffset += Length;
1774
1775 /* Dump the node specific data */
1776
1777 switch (IortNode->Type)
1778 {
1779 case ACPI_IORT_NODE_ITS_GROUP:
1780
1781 /* Validate IortItsGroup to avoid compiler warnings */
1782
1783 if (IortItsGroup)
1784 {
1785 for (i = 0; i < IortItsGroup->ItsCount; i++)
1786 {
1787 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1788 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1789 4, AcpiDmTableInfoIort0a);
1790 NodeOffset += 4;
1791 }
1792 }
1793 break;
1794
1795 case ACPI_IORT_NODE_NAMED_COMPONENT:
1796
1797 /* Dump the Padding (optional) */
1798
1799 if (IortNode->Length > NodeOffset)
1800 {
1801 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1802 Table, IortNode->Length - NodeOffset,
1803 AcpiDmTableInfoIort1a);
1804 if (ACPI_FAILURE (Status))
1805 {
1806 return;
1807 }
1808 }
1809 break;
1810
1811 case ACPI_IORT_NODE_SMMU:
1812
1813 AcpiOsPrintf ("\n");
1814
1815 /* Validate IortSmmu to avoid compiler warnings */
1816
1817 if (IortSmmu)
1818 {
1819 Length = 2 * sizeof (UINT64);
1820 NodeOffset = IortSmmu->GlobalInterruptOffset;
1821 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1822 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1823 Length, AcpiDmTableInfoIort3a);
1824 if (ACPI_FAILURE (Status))
1825 {
1826 return;
1827 }
1828
1829 NodeOffset = IortSmmu->ContextInterruptOffset;
1830 for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
1831 {
1832 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1833 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1834 8, AcpiDmTableInfoIort3b);
1835 if (ACPI_FAILURE (Status))
1836 {
1837 return;
1838 }
1839 NodeOffset += 8;
1840 }
1841
1842 NodeOffset = IortSmmu->PmuInterruptOffset;
1843 for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
1844 {
1845 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1846 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1847 8, AcpiDmTableInfoIort3c);
1848 if (ACPI_FAILURE (Status))
1849 {
1850 return;
1851 }
1852 NodeOffset += 8;
1853 }
1854 }
1855 break;
1856
1857 default:
1858
1859 break;
1860 }
1861
1862 /* Dump the ID mappings */
1863
1864 NodeOffset = IortNode->MappingOffset;
1865 for (i = 0; i < IortNode->MappingCount; i++)
1866 {
1867 AcpiOsPrintf ("\n");
1868 Length = sizeof (ACPI_IORT_ID_MAPPING);
1869 Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
1870 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
1871 Length, AcpiDmTableInfoIortMap);
1872 if (ACPI_FAILURE (Status))
1873 {
1874 return;
1875 }
1876 NodeOffset += Length;
1877 }
1878
1879 NextSubTable:
1880 /* Point to next node subtable */
1881
1882 Offset += IortNode->Length;
1883 IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
1884 }
1885 }
1886
1887
1888 /*******************************************************************************
1889 *
1890 * FUNCTION: AcpiDmDumpIvrs
1891 *
1892 * PARAMETERS: Table - A IVRS table
1893 *
1894 * RETURN: None
1895 *
1896 * DESCRIPTION: Format the contents of a IVRS
1897 *
1898 ******************************************************************************/
1899
1900 static UINT8 EntrySizes[] = {4,8,16,32};
1901
1902 void
1903 AcpiDmDumpIvrs (
1904 ACPI_TABLE_HEADER *Table)
1905 {
1906 ACPI_STATUS Status;
1907 UINT32 Offset = sizeof (ACPI_TABLE_IVRS);
1908 UINT32 EntryOffset;
1909 UINT32 EntryLength;
1910 UINT32 EntryType;
1911 ACPI_IVRS_DE_HEADER *DeviceEntry;
1912 ACPI_IVRS_HEADER *SubTable;
1913 ACPI_DMTABLE_INFO *InfoTable;
1914
1915
1916 /* Main table */
1917
1918 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
1919 if (ACPI_FAILURE (Status))
1920 {
1921 return;
1922 }
1923
1924 /* Subtables */
1925
1926 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
1927 while (Offset < Table->Length)
1928 {
1929 /* Common subtable header */
1930
1931 AcpiOsPrintf ("\n");
1932 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1933 SubTable->Length, AcpiDmTableInfoIvrsHdr);
1934 if (ACPI_FAILURE (Status))
1935 {
1936 return;
1937 }
1938
1939 switch (SubTable->Type)
1940 {
1941 case ACPI_IVRS_TYPE_HARDWARE:
1942
1943 InfoTable = AcpiDmTableInfoIvrs0;
1944 break;
1945
1946 case ACPI_IVRS_TYPE_MEMORY1:
1947 case ACPI_IVRS_TYPE_MEMORY2:
1948 case ACPI_IVRS_TYPE_MEMORY3:
1949
1950 InfoTable = AcpiDmTableInfoIvrs1;
1951 break;
1952
1953 default:
1954
1955 AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n",
1956 SubTable->Type);
1957
1958 /* Attempt to continue */
1959
1960 if (!SubTable->Length)
1961 {
1962 AcpiOsPrintf ("Invalid zero length subtable\n");
1963 return;
1964 }
1965 goto NextSubTable;
1966 }
1967
1968 /* Dump the subtable */
1969
1970 AcpiOsPrintf ("\n");
1971 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
1972 SubTable->Length, InfoTable);
1973 if (ACPI_FAILURE (Status))
1974 {
1975 return;
1976 }
1977
1978 /* The hardware subtable can contain multiple device entries */
1979
1980 if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE)
1981 {
1982 EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
1983 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable,
1984 sizeof (ACPI_IVRS_HARDWARE));
1985
1986 while (EntryOffset < (Offset + SubTable->Length))
1987 {
1988 AcpiOsPrintf ("\n");
1989 /*
1990 * Upper 2 bits of Type encode the length of the device entry
1991 *
1992 * 00 = 4 byte
1993 * 01 = 8 byte
1994 * 10 = 16 byte - currently no entries defined
1995 * 11 = 32 byte - currently no entries defined
1996 */
1997 EntryType = DeviceEntry->Type;
1998 EntryLength = EntrySizes [EntryType >> 6];
1999
2000 switch (EntryType)
2001 {
2002 /* 4-byte device entries */
2003
2004 case ACPI_IVRS_TYPE_PAD4:
2005 case ACPI_IVRS_TYPE_ALL:
2006 case ACPI_IVRS_TYPE_SELECT:
2007 case ACPI_IVRS_TYPE_START:
2008 case ACPI_IVRS_TYPE_END:
2009
2010 InfoTable = AcpiDmTableInfoIvrs4;
2011 break;
2012
2013 /* 8-byte entries, type A */
2014
2015 case ACPI_IVRS_TYPE_ALIAS_SELECT:
2016 case ACPI_IVRS_TYPE_ALIAS_START:
2017
2018 InfoTable = AcpiDmTableInfoIvrs8a;
2019 break;
2020
2021 /* 8-byte entries, type B */
2022
2023 case ACPI_IVRS_TYPE_PAD8:
2024 case ACPI_IVRS_TYPE_EXT_SELECT:
2025 case ACPI_IVRS_TYPE_EXT_START:
2026
2027 InfoTable = AcpiDmTableInfoIvrs8b;
2028 break;
2029
2030 /* 8-byte entries, type C */
2031
2032 case ACPI_IVRS_TYPE_SPECIAL:
2033
2034 InfoTable = AcpiDmTableInfoIvrs8c;
2035 break;
2036
2037 default:
2038 InfoTable = AcpiDmTableInfoIvrs4;
2039 AcpiOsPrintf (
2040 "\n**** Unknown IVRS device entry type/length: "
2041 "0x%.2X/0x%X at offset 0x%.4X: (header below)\n",
2042 EntryType, EntryLength, EntryOffset);
2043 break;
2044 }
2045
2046 /* Dump the Device Entry */
2047
2048 Status = AcpiDmDumpTable (Table->Length, EntryOffset,
2049 DeviceEntry, EntryLength, InfoTable);
2050 if (ACPI_FAILURE (Status))
2051 {
2052 return;
2053 }
2054
2055 EntryOffset += EntryLength;
2056 DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, DeviceEntry,
2057 EntryLength);
2058 }
2059 }
2060
2061 NextSubTable:
2062 /* Point to next subtable */
2063
2064 Offset += SubTable->Length;
2065 SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length);
2066 }
2067 }
2068
2069
2070 /*******************************************************************************
2071 *
2072 * FUNCTION: AcpiDmDumpLpit
2073 *
2074 * PARAMETERS: Table - A LPIT table
2075 *
2076 * RETURN: None
2077 *
2078 * DESCRIPTION: Format the contents of a LPIT. This table type consists
2079 * of an open-ended number of subtables. Note: There are no
2080 * entries in the main table. An LPIT consists of the table
2081 * header and then subtables only.
2082 *
2083 ******************************************************************************/
2084
2085 void
2086 AcpiDmDumpLpit (
2087 ACPI_TABLE_HEADER *Table)
2088 {
2089 ACPI_STATUS Status;
2090 ACPI_LPIT_HEADER *SubTable;
2091 UINT32 Length = Table->Length;
2092 UINT32 Offset = sizeof (ACPI_TABLE_LPIT);
2093 ACPI_DMTABLE_INFO *InfoTable;
2094 UINT32 SubTableLength;
2095
2096
2097 /* Subtables */
2098
2099 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
2100 while (Offset < Table->Length)
2101 {
2102 /* Common subtable header */
2103
2104 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2105 sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr);
2106 if (ACPI_FAILURE (Status))
2107 {
2108 return;
2109 }
2110
2111 switch (SubTable->Type)
2112 {
2113 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
2114
2115 InfoTable = AcpiDmTableInfoLpit0;
2116 SubTableLength = sizeof (ACPI_LPIT_NATIVE);
2117 break;
2118
2119 default:
2120
2121 /* Cannot continue on unknown type - no length */
2122
2123 AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", SubTable->Type);
2124 return;
2125 }
2126
2127 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2128 SubTableLength, InfoTable);
2129 if (ACPI_FAILURE (Status))
2130 {
2131 return;
2132 }
2133 AcpiOsPrintf ("\n");
2134
2135 /* Point to next subtable */
2136
2137 Offset += SubTableLength;
2138 SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength);
2139 }
2140 }
2141
2142
2143 /*******************************************************************************
2144 *
2145 * FUNCTION: AcpiDmDumpMadt
2146 *
2147 * PARAMETERS: Table - A MADT table
2148 *
2149 * RETURN: None
2150 *
2151 * DESCRIPTION: Format the contents of a MADT. This table type consists
2152 * of an open-ended number of subtables.
2153 *
2154 ******************************************************************************/
2155
2156 void
2157 AcpiDmDumpMadt (
2158 ACPI_TABLE_HEADER *Table)
2159 {
2160 ACPI_STATUS Status;
2161 ACPI_SUBTABLE_HEADER *SubTable;
2162 UINT32 Length = Table->Length;
2163 UINT32 Offset = sizeof (ACPI_TABLE_MADT);
2164 ACPI_DMTABLE_INFO *InfoTable;
2165
2166
2167 /* Main table */
2168
2169 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
2170 if (ACPI_FAILURE (Status))
2171 {
2172 return;
2173 }
2174
2175 /* Subtables */
2176
2177 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
2178 while (Offset < Table->Length)
2179 {
2180 /* Common subtable header */
2181
2182 AcpiOsPrintf ("\n");
2183 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2184 SubTable->Length, AcpiDmTableInfoMadtHdr);
2185 if (ACPI_FAILURE (Status))
2186 {
2187 return;
2188 }
2189
2190 switch (SubTable->Type)
2191 {
2192 case ACPI_MADT_TYPE_LOCAL_APIC:
2193
2194 InfoTable = AcpiDmTableInfoMadt0;
2195 break;
2196
2197 case ACPI_MADT_TYPE_IO_APIC:
2198
2199 InfoTable = AcpiDmTableInfoMadt1;
2200 break;
2201
2202 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
2203
2204 InfoTable = AcpiDmTableInfoMadt2;
2205 break;
2206
2207 case ACPI_MADT_TYPE_NMI_SOURCE:
2208
2209 InfoTable = AcpiDmTableInfoMadt3;
2210 break;
2211
2212 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
2213
2214 InfoTable = AcpiDmTableInfoMadt4;
2215 break;
2216
2217 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
2218
2219 InfoTable = AcpiDmTableInfoMadt5;
2220 break;
2221
2222 case ACPI_MADT_TYPE_IO_SAPIC:
2223
2224 InfoTable = AcpiDmTableInfoMadt6;
2225 break;
2226
2227 case ACPI_MADT_TYPE_LOCAL_SAPIC:
2228
2229 InfoTable = AcpiDmTableInfoMadt7;
2230 break;
2231
2232 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
2233
2234 InfoTable = AcpiDmTableInfoMadt8;
2235 break;
2236
2237 case ACPI_MADT_TYPE_LOCAL_X2APIC:
2238
2239 InfoTable = AcpiDmTableInfoMadt9;
2240 break;
2241
2242 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
2243
2244 InfoTable = AcpiDmTableInfoMadt10;
2245 break;
2246
2247 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
2248
2249 InfoTable = AcpiDmTableInfoMadt11;
2250 break;
2251
2252 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
2253
2254 InfoTable = AcpiDmTableInfoMadt12;
2255 break;
2256
2257 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2258
2259 InfoTable = AcpiDmTableInfoMadt13;
2260 break;
2261
2262 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2263
2264 InfoTable = AcpiDmTableInfoMadt14;
2265 break;
2266
2267 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2268
2269 InfoTable = AcpiDmTableInfoMadt15;
2270 break;
2271
2272 default:
2273
2274 AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", SubTable->Type);
2275
2276 /* Attempt to continue */
2277
2278 if (!SubTable->Length)
2279 {
2280 AcpiOsPrintf ("Invalid zero length subtable\n");
2281 return;
2282 }
2283 goto NextSubTable;
2284 }
2285
2286 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2287 SubTable->Length, InfoTable);
2288 if (ACPI_FAILURE (Status))
2289 {
2290 return;
2291 }
2292
2293 NextSubTable:
2294 /* Point to next subtable */
2295
2296 Offset += SubTable->Length;
2297 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
2298 }
2299 }
2300
2301
2302 /*******************************************************************************
2303 *
2304 * FUNCTION: AcpiDmDumpMcfg
2305 *
2306 * PARAMETERS: Table - A MCFG Table
2307 *
2308 * RETURN: None
2309 *
2310 * DESCRIPTION: Format the contents of a MCFG table
2311 *
2312 ******************************************************************************/
2313
2314 void
2315 AcpiDmDumpMcfg (
2316 ACPI_TABLE_HEADER *Table)
2317 {
2318 ACPI_STATUS Status;
2319 UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
2320 ACPI_MCFG_ALLOCATION *SubTable;
2321
2322
2323 /* Main table */
2324
2325 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
2326 if (ACPI_FAILURE (Status))
2327 {
2328 return;
2329 }
2330
2331 /* Subtables */
2332
2333 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
2334 while (Offset < Table->Length)
2335 {
2336 if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
2337 {
2338 AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
2339 sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
2340 return;
2341 }
2342
2343 AcpiOsPrintf ("\n");
2344 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2345 sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
2346 if (ACPI_FAILURE (Status))
2347 {
2348 return;
2349 }
2350
2351 /* Point to next subtable (each subtable is of fixed length) */
2352
2353 Offset += sizeof (ACPI_MCFG_ALLOCATION);
2354 SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
2355 sizeof (ACPI_MCFG_ALLOCATION));
2356 }
2357 }
2358
2359
2360 /*******************************************************************************
2361 *
2362 * FUNCTION: AcpiDmDumpMpst
2363 *
2364 * PARAMETERS: Table - A MPST Table
2365 *
2366 * RETURN: None
2367 *
2368 * DESCRIPTION: Format the contents of a MPST table
2369 *
2370 ******************************************************************************/
2371
2372 void
2373 AcpiDmDumpMpst (
2374 ACPI_TABLE_HEADER *Table)
2375 {
2376 ACPI_STATUS Status;
2377 UINT32 Offset = sizeof (ACPI_TABLE_MPST);
2378 ACPI_MPST_POWER_NODE *SubTable0;
2379 ACPI_MPST_POWER_STATE *SubTable0A;
2380 ACPI_MPST_COMPONENT *SubTable0B;
2381 ACPI_MPST_DATA_HDR *SubTable1;
2382 ACPI_MPST_POWER_DATA *SubTable2;
2383 UINT16 SubtableCount;
2384 UINT32 PowerStateCount;
2385 UINT32 ComponentCount;
2386
2387
2388 /* Main table */
2389
2390 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
2391 if (ACPI_FAILURE (Status))
2392 {
2393 return;
2394 }
2395
2396 /* Subtable: Memory Power Node(s) */
2397
2398 SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
2399 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
2400
2401 while ((Offset < Table->Length) && SubtableCount)
2402 {
2403 AcpiOsPrintf ("\n");
2404 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0,
2405 sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
2406 if (ACPI_FAILURE (Status))
2407 {
2408 return;
2409 }
2410
2411 /* Extract the sub-subtable counts */
2412
2413 PowerStateCount = SubTable0->NumPowerStates;
2414 ComponentCount = SubTable0->NumPhysicalComponents;
2415 Offset += sizeof (ACPI_MPST_POWER_NODE);
2416
2417 /* Sub-subtables - Memory Power State Structure(s) */
2418
2419 SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0,
2420 sizeof (ACPI_MPST_POWER_NODE));
2421
2422 while (PowerStateCount)
2423 {
2424 AcpiOsPrintf ("\n");
2425 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A,
2426 sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
2427 if (ACPI_FAILURE (Status))
2428 {
2429 return;
2430 }
2431
2432 SubTable0A++;
2433 PowerStateCount--;
2434 Offset += sizeof (ACPI_MPST_POWER_STATE);
2435 }
2436
2437 /* Sub-subtables - Physical Component ID Structure(s) */
2438
2439 SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A);
2440
2441 if (ComponentCount)
2442 {
2443 AcpiOsPrintf ("\n");
2444 }
2445
2446 while (ComponentCount)
2447 {
2448 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B,
2449 sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
2450 if (ACPI_FAILURE (Status))
2451 {
2452 return;
2453 }
2454
2455 SubTable0B++;
2456 ComponentCount--;
2457 Offset += sizeof (ACPI_MPST_COMPONENT);
2458 }
2459
2460 /* Point to next Memory Power Node subtable */
2461
2462 SubtableCount--;
2463 SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0,
2464 sizeof (ACPI_MPST_POWER_NODE) +
2465 (sizeof (ACPI_MPST_POWER_STATE) * SubTable0->NumPowerStates) +
2466 (sizeof (ACPI_MPST_COMPONENT) * SubTable0->NumPhysicalComponents));
2467 }
2468
2469 /* Subtable: Count of Memory Power State Characteristic structures */
2470
2471 AcpiOsPrintf ("\n");
2472 SubTable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, SubTable0);
2473 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable1,
2474 sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
2475 if (ACPI_FAILURE (Status))
2476 {
2477 return;
2478 }
2479
2480 SubtableCount = SubTable1->CharacteristicsCount;
2481 Offset += sizeof (ACPI_MPST_DATA_HDR);
2482
2483 /* Subtable: Memory Power State Characteristics structure(s) */
2484
2485 SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, sizeof (ACPI_MPST_DATA_HDR));
2486
2487 while ((Offset < Table->Length) && SubtableCount)
2488 {
2489 AcpiOsPrintf ("\n");
2490 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2,
2491 sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
2492 if (ACPI_FAILURE (Status))
2493 {
2494 return;
2495 }
2496
2497 SubTable2++;
2498 SubtableCount--;
2499 Offset += sizeof (ACPI_MPST_POWER_DATA);
2500 }
2501 }
2502
2503
2504 /*******************************************************************************
2505 *
2506 * FUNCTION: AcpiDmDumpMsct
2507 *
2508 * PARAMETERS: Table - A MSCT table
2509 *
2510 * RETURN: None
2511 *
2512 * DESCRIPTION: Format the contents of a MSCT
2513 *
2514 ******************************************************************************/
2515
2516 void
2517 AcpiDmDumpMsct (
2518 ACPI_TABLE_HEADER *Table)
2519 {
2520 ACPI_STATUS Status;
2521 UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
2522 ACPI_MSCT_PROXIMITY *SubTable;
2523
2524
2525 /* Main table */
2526
2527 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
2528 if (ACPI_FAILURE (Status))
2529 {
2530 return;
2531 }
2532
2533 /* Subtables */
2534
2535 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
2536 while (Offset < Table->Length)
2537 {
2538 /* Common subtable header */
2539
2540 AcpiOsPrintf ("\n");
2541 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2542 sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
2543 if (ACPI_FAILURE (Status))
2544 {
2545 return;
2546 }
2547
2548 /* Point to next subtable */
2549
2550 Offset += sizeof (ACPI_MSCT_PROXIMITY);
2551 SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, sizeof (ACPI_MSCT_PROXIMITY));
2552 }
2553 }
2554
2555
2556 /*******************************************************************************
2557 *
2558 * FUNCTION: AcpiDmDumpMtmr
2559 *
2560 * PARAMETERS: Table - A MTMR table
2561 *
2562 * RETURN: None
2563 *
2564 * DESCRIPTION: Format the contents of a MTMR
2565 *
2566 ******************************************************************************/
2567
2568 void
2569 AcpiDmDumpMtmr (
2570 ACPI_TABLE_HEADER *Table)
2571 {
2572 ACPI_STATUS Status;
2573 UINT32 Offset = sizeof (ACPI_TABLE_MTMR);
2574 ACPI_MTMR_ENTRY *SubTable;
2575
2576
2577 /* Main table */
2578
2579 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
2580 if (ACPI_FAILURE (Status))
2581 {
2582 return;
2583 }
2584
2585 /* Subtables */
2586
2587 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
2588 while (Offset < Table->Length)
2589 {
2590 /* Common subtable header */
2591
2592 AcpiOsPrintf ("\n");
2593 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2594 sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
2595 if (ACPI_FAILURE (Status))
2596 {
2597 return;
2598 }
2599
2600 /* Point to next subtable */
2601
2602 Offset += sizeof (ACPI_MTMR_ENTRY);
2603 SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, sizeof (ACPI_MTMR_ENTRY));
2604 }
2605 }
2606
2607
2608 /*******************************************************************************
2609 *
2610 * FUNCTION: AcpiDmDumpNfit
2611 *
2612 * PARAMETERS: Table - A NFIT table
2613 *
2614 * RETURN: None
2615 *
2616 * DESCRIPTION: Format the contents of an NFIT.
2617 *
2618 ******************************************************************************/
2619
2620 void
2621 AcpiDmDumpNfit (
2622 ACPI_TABLE_HEADER *Table)
2623 {
2624 ACPI_STATUS Status;
2625 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
2626 UINT32 FieldOffset = 0;
2627 UINT32 Length;
2628 ACPI_NFIT_HEADER *SubTable;
2629 ACPI_DMTABLE_INFO *InfoTable;
2630 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
2631 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
2632 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2633 UINT32 i;
2634
2635
2636 /* Main table */
2637
2638 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
2639 if (ACPI_FAILURE (Status))
2640 {
2641 return;
2642 }
2643
2644 /* Subtables */
2645
2646 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
2647 while (Offset < Table->Length)
2648 {
2649 /* NFIT subtable header */
2650
2651 AcpiOsPrintf ("\n");
2652 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2653 SubTable->Length, AcpiDmTableInfoNfitHdr);
2654 if (ACPI_FAILURE (Status))
2655 {
2656 return;
2657 }
2658
2659 switch (SubTable->Type)
2660 {
2661 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
2662
2663 InfoTable = AcpiDmTableInfoNfit0;
2664 break;
2665
2666 case ACPI_NFIT_TYPE_MEMORY_MAP:
2667
2668 InfoTable = AcpiDmTableInfoNfit1;
2669 break;
2670
2671 case ACPI_NFIT_TYPE_INTERLEAVE:
2672
2673 /* Has a variable number of 32-bit values at the end */
2674
2675 InfoTable = AcpiDmTableInfoNfit2;
2676 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable);
2677 FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE);
2678 break;
2679
2680 case ACPI_NFIT_TYPE_SMBIOS:
2681
2682 SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable);
2683 InfoTable = AcpiDmTableInfoNfit3;
2684 break;
2685
2686 case ACPI_NFIT_TYPE_CONTROL_REGION:
2687
2688 InfoTable = AcpiDmTableInfoNfit4;
2689 break;
2690
2691 case ACPI_NFIT_TYPE_DATA_REGION:
2692
2693 InfoTable = AcpiDmTableInfoNfit5;
2694 break;
2695
2696 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2697
2698 /* Has a variable number of 64-bit addresses at the end */
2699
2700 InfoTable = AcpiDmTableInfoNfit6;
2701 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable);
2702 FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64);
2703 break;
2704
2705 default:
2706 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", SubTable->Type);
2707
2708 /* Attempt to continue */
2709
2710 if (!SubTable->Length)
2711 {
2712 AcpiOsPrintf ("Invalid zero length subtable\n");
2713 return;
2714 }
2715 goto NextSubTable;
2716 }
2717
2718 AcpiOsPrintf ("\n");
2719 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
2720 SubTable->Length, InfoTable);
2721 if (ACPI_FAILURE (Status))
2722 {
2723 return;
2724 }
2725
2726 /* Per-subtable variable-length fields */
2727
2728 switch (SubTable->Type)
2729 {
2730 case ACPI_NFIT_TYPE_INTERLEAVE:
2731
2732 for (i = 0; i < Interleave->LineCount; i++)
2733 {
2734 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2735 &Interleave->LineOffset[i],
2736 sizeof (UINT32), AcpiDmTableInfoNfit2a);
2737 if (ACPI_FAILURE (Status))
2738 {
2739 return;
2740 }
2741
2742 FieldOffset += sizeof (UINT32);
2743 }
2744 break;
2745
2746 case ACPI_NFIT_TYPE_SMBIOS:
2747
2748 Length = SubTable->Length - sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
2749 if (Length)
2750 {
2751 Status = AcpiDmDumpTable (Table->Length,
2752 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
2753 SmbiosInfo,
2754 Length, AcpiDmTableInfoNfit3a);
2755 if (ACPI_FAILURE (Status))
2756 {
2757 return;
2758 }
2759 }
2760
2761 break;
2762
2763 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2764
2765 for (i = 0; i < Hint->HintCount; i++)
2766 {
2767 Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
2768 &Hint->HintAddress[i],
2769 sizeof (UINT64), AcpiDmTableInfoNfit6a);
2770 if (ACPI_FAILURE (Status))
2771 {
2772 return;
2773 }
2774
2775 FieldOffset += sizeof (UINT64);
2776 }
2777 break;
2778
2779 default:
2780 break;
2781 }
2782
2783 NextSubTable:
2784 /* Point to next subtable */
2785
2786 Offset += SubTable->Length;
2787 SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length);
2788 }
2789 }
2790
2791
2792 /*******************************************************************************
2793 *
2794 * FUNCTION: AcpiDmDumpPcct
2795 *
2796 * PARAMETERS: Table - A PCCT table
2797 *
2798 * RETURN: None
2799 *
2800 * DESCRIPTION: Format the contents of a PCCT. This table type consists
2801 * of an open-ended number of subtables.
2802 *
2803 ******************************************************************************/
2804
2805 void
2806 AcpiDmDumpPcct (
2807 ACPI_TABLE_HEADER *Table)
2808 {
2809 ACPI_STATUS Status;
2810 ACPI_PCCT_SUBSPACE *SubTable;
2811 ACPI_DMTABLE_INFO *InfoTable;
2812 UINT32 Length = Table->Length;
2813 UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
2814
2815
2816 /* Main table */
2817
2818 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
2819 if (ACPI_FAILURE (Status))
2820 {
2821 return;
2822 }
2823
2824 /* Subtables */
2825
2826 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
2827 while (Offset < Table->Length)
2828 {
2829 /* Common subtable header */
2830
2831 AcpiOsPrintf ("\n");
2832 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2833 SubTable->Header.Length, AcpiDmTableInfoPcctHdr);
2834 if (ACPI_FAILURE (Status))
2835 {
2836 return;
2837 }
2838
2839 switch (SubTable->Header.Type)
2840 {
2841 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2842
2843 InfoTable = AcpiDmTableInfoPcct0;
2844 break;
2845
2846 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2847
2848 InfoTable = AcpiDmTableInfoPcct1;
2849 break;
2850
2851 default:
2852
2853 AcpiOsPrintf (
2854 "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n",
2855 SubTable->Header.Type);
2856 return;
2857 }
2858
2859 AcpiOsPrintf ("\n");
2860 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2861 SubTable->Header.Length, InfoTable);
2862 if (ACPI_FAILURE (Status))
2863 {
2864 return;
2865 }
2866
2867 /* Point to next subtable */
2868
2869 Offset += SubTable->Header.Length;
2870 SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable,
2871 SubTable->Header.Length);
2872 }
2873 }
2874
2875
2876 /*******************************************************************************
2877 *
2878 * FUNCTION: AcpiDmDumpPmtt
2879 *
2880 * PARAMETERS: Table - A PMTT table
2881 *
2882 * RETURN: None
2883 *
2884 * DESCRIPTION: Format the contents of a PMTT. This table type consists
2885 * of an open-ended number of subtables.
2886 *
2887 ******************************************************************************/
2888
2889 void
2890 AcpiDmDumpPmtt (
2891 ACPI_TABLE_HEADER *Table)
2892 {
2893 ACPI_STATUS Status;
2894 ACPI_PMTT_HEADER *SubTable;
2895 ACPI_PMTT_HEADER *MemSubTable;
2896 ACPI_PMTT_HEADER *DimmSubTable;
2897 ACPI_PMTT_DOMAIN *DomainArray;
2898 UINT32 Length = Table->Length;
2899 UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
2900 UINT32 MemOffset;
2901 UINT32 DimmOffset;
2902 UINT32 DomainOffset;
2903 UINT32 DomainCount;
2904
2905
2906 /* Main table */
2907
2908 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
2909 if (ACPI_FAILURE (Status))
2910 {
2911 return;
2912 }
2913
2914 /* Subtables */
2915
2916 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
2917 while (Offset < Table->Length)
2918 {
2919 /* Common subtable header */
2920
2921 AcpiOsPrintf ("\n");
2922 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2923 SubTable->Length, AcpiDmTableInfoPmttHdr);
2924 if (ACPI_FAILURE (Status))
2925 {
2926 return;
2927 }
2928
2929 /* Only Socket subtables are expected at this level */
2930
2931 if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET)
2932 {
2933 AcpiOsPrintf (
2934 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2935 SubTable->Type);
2936 return;
2937 }
2938
2939 /* Dump the fixed-length portion of the subtable */
2940
2941 Status = AcpiDmDumpTable (Length, Offset, SubTable,
2942 SubTable->Length, AcpiDmTableInfoPmtt0);
2943 if (ACPI_FAILURE (Status))
2944 {
2945 return;
2946 }
2947
2948 /* Walk the memory controller subtables */
2949
2950 MemOffset = sizeof (ACPI_PMTT_SOCKET);
2951 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable,
2952 sizeof (ACPI_PMTT_SOCKET));
2953
2954 while (((Offset + MemOffset) < Table->Length) &&
2955 (MemOffset < SubTable->Length))
2956 {
2957 /* Common subtable header */
2958
2959 AcpiOsPrintf ("\n");
2960 Status = AcpiDmDumpTable (Length,
2961 Offset + MemOffset, MemSubTable,
2962 MemSubTable->Length, AcpiDmTableInfoPmttHdr);
2963 if (ACPI_FAILURE (Status))
2964 {
2965 return;
2966 }
2967
2968 /* Only memory controller subtables are expected at this level */
2969
2970 if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER)
2971 {
2972 AcpiOsPrintf (
2973 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
2974 MemSubTable->Type);
2975 return;
2976 }
2977
2978 /* Dump the fixed-length portion of the controller subtable */
2979
2980 Status = AcpiDmDumpTable (Length,
2981 Offset + MemOffset, MemSubTable,
2982 MemSubTable->Length, AcpiDmTableInfoPmtt1);
2983 if (ACPI_FAILURE (Status))
2984 {
2985 return;
2986 }
2987
2988 /* Walk the variable count of proximity domains */
2989
2990 DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount;
2991 DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
2992 DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable,
2993 sizeof (ACPI_PMTT_CONTROLLER));
2994
2995 while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
2996 ((MemOffset + DomainOffset) < SubTable->Length) &&
2997 DomainCount)
2998 {
2999 Status = AcpiDmDumpTable (Length,
3000 Offset + MemOffset + DomainOffset, DomainArray,
3001 sizeof (ACPI_PMTT_DOMAIN), AcpiDmTableInfoPmtt1a);
3002 if (ACPI_FAILURE (Status))
3003 {
3004 return;
3005 }
3006
3007 DomainOffset += sizeof (ACPI_PMTT_DOMAIN);
3008 DomainArray++;
3009 DomainCount--;
3010 }
3011
3012 if (DomainCount)
3013 {
3014 AcpiOsPrintf (
3015 "\n**** DomainCount exceeds subtable length\n\n");
3016 }
3017
3018 /* Walk the physical component (DIMM) subtables */
3019
3020 DimmOffset = DomainOffset;
3021 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable,
3022 DomainOffset);
3023
3024 while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
3025 (DimmOffset < MemSubTable->Length))
3026 {
3027 /* Common subtable header */
3028
3029 AcpiOsPrintf ("\n");
3030 Status = AcpiDmDumpTable (Length,
3031 Offset + MemOffset + DimmOffset, DimmSubTable,
3032 DimmSubTable->Length, AcpiDmTableInfoPmttHdr);
3033 if (ACPI_FAILURE (Status))
3034 {
3035 return;
3036 }
3037
3038 /* Only DIMM subtables are expected at this level */
3039
3040 if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM)
3041 {
3042 AcpiOsPrintf (
3043 "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n",
3044 DimmSubTable->Type);
3045 return;
3046 }
3047
3048 /* Dump the fixed-length DIMM subtable */
3049
3050 Status = AcpiDmDumpTable (Length,
3051 Offset + MemOffset + DimmOffset, DimmSubTable,
3052 DimmSubTable->Length, AcpiDmTableInfoPmtt2);
3053 if (ACPI_FAILURE (Status))
3054 {
3055 return;
3056 }
3057
3058 /* Point to next DIMM subtable */
3059
3060 DimmOffset += DimmSubTable->Length;
3061 DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3062 DimmSubTable, DimmSubTable->Length);
3063 }
3064
3065 /* Point to next Controller subtable */
3066
3067 MemOffset += MemSubTable->Length;
3068 MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3069 MemSubTable, MemSubTable->Length);
3070 }
3071
3072 /* Point to next Socket subtable */
3073
3074 Offset += SubTable->Length;
3075 SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
3076 SubTable, SubTable->Length);
3077 }
3078 }
3079
3080
3081 /*******************************************************************************
3082 *
3083 * FUNCTION: AcpiDmDumpS3pt
3084 *
3085 * PARAMETERS: Table - A S3PT table
3086 *
3087 * RETURN: Length of the table
3088 *
3089 * DESCRIPTION: Format the contents of a S3PT
3090 *
3091 ******************************************************************************/
3092
3093 UINT32
3094 AcpiDmDumpS3pt (
3095 ACPI_TABLE_HEADER *Tables)
3096 {
3097 ACPI_STATUS Status;
3098 UINT32 Offset = sizeof (ACPI_TABLE_S3PT);
3099 ACPI_S3PT_HEADER *SubTable;
3100 ACPI_DMTABLE_INFO *InfoTable;
3101 ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
3102
3103
3104 /* Main table */
3105
3106 Status = AcpiDmDumpTable (Offset, 0, S3ptTable, 0, AcpiDmTableInfoS3pt);
3107 if (ACPI_FAILURE (Status))
3108 {
3109 return 0;
3110 }
3111
3112 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, S3ptTable, Offset);
3113 while (Offset < S3ptTable->Length)
3114 {
3115 /* Common subtable header */
3116
3117 AcpiOsPrintf ("\n");
3118 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3119 SubTable->Length, AcpiDmTableInfoS3ptHdr);
3120 if (ACPI_FAILURE (Status))
3121 {
3122 return 0;
3123 }
3124
3125 switch (SubTable->Type)
3126 {
3127 case ACPI_S3PT_TYPE_RESUME:
3128
3129 InfoTable = AcpiDmTableInfoS3pt0;
3130 break;
3131
3132 case ACPI_S3PT_TYPE_SUSPEND:
3133
3134 InfoTable = AcpiDmTableInfoS3pt1;
3135 break;
3136
3137 default:
3138
3139 AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", SubTable->Type);
3140
3141 /* Attempt to continue */
3142
3143 if (!SubTable->Length)
3144 {
3145 AcpiOsPrintf ("Invalid zero length subtable\n");
3146 return 0;
3147 }
3148 goto NextSubTable;
3149 }
3150
3151 AcpiOsPrintf ("\n");
3152 Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable,
3153 SubTable->Length, InfoTable);
3154 if (ACPI_FAILURE (Status))
3155 {
3156 return 0;
3157 }
3158
3159 NextSubTable:
3160 /* Point to next subtable */
3161
3162 Offset += SubTable->Length;
3163 SubTable = ACPI_ADD_PTR (ACPI_S3PT_HEADER, SubTable, SubTable->Length);
3164 }
3165
3166 return (S3ptTable->Length);
3167 }
3168
3169
3170 /*******************************************************************************
3171 *
3172 * FUNCTION: AcpiDmDumpSlic
3173 *
3174 * PARAMETERS: Table - A SLIC table
3175 *
3176 * RETURN: None
3177 *
3178 * DESCRIPTION: Format the contents of a SLIC
3179 *
3180 ******************************************************************************/
3181
3182 void
3183 AcpiDmDumpSlic (
3184 ACPI_TABLE_HEADER *Table)
3185 {
3186 (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
3187 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
3188 }
3189
3190
3191 /*******************************************************************************
3192 *
3193 * FUNCTION: AcpiDmDumpSlit
3194 *
3195 * PARAMETERS: Table - An SLIT
3196 *
3197 * RETURN: None
3198 *
3199 * DESCRIPTION: Format the contents of a SLIT
3200 *
3201 ******************************************************************************/
3202
3203 void
3204 AcpiDmDumpSlit (
3205 ACPI_TABLE_HEADER *Table)
3206 {
3207 ACPI_STATUS Status;
3208 UINT32 Offset;
3209 UINT8 *Row;
3210 UINT32 Localities;
3211 UINT32 i;
3212 UINT32 j;
3213
3214
3215 /* Main table */
3216
3217 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
3218 if (ACPI_FAILURE (Status))
3219 {
3220 return;
3221 }
3222
3223 /* Display the Locality NxN Matrix */
3224
3225 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
3226 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
3227 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
3228
3229 for (i = 0; i < Localities; i++)
3230 {
3231 /* Display one row of the matrix */
3232
3233 AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
3234 for (j = 0; j < Localities; j++)
3235 {
3236 /* Check for beyond EOT */
3237
3238 if (Offset >= Table->Length)
3239 {
3240 AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
3241 return;
3242 }
3243
3244 AcpiOsPrintf ("%2.2X", Row[j]);
3245 Offset++;
3246
3247 /* Display up to 16 bytes per output row */
3248
3249 if ((j+1) < Localities)
3250 {
3251 AcpiOsPrintf (" ");
3252
3253 if (j && (((j+1) % 16) == 0))
3254 {
3255 AcpiOsPrintf ("\\\n"); /* With line continuation char */
3256 AcpiDmLineHeader (Offset, 0, NULL);
3257 }
3258 }
3259 }
3260
3261 /* Point to next row */
3262
3263 AcpiOsPrintf ("\n");
3264 Row += Localities;
3265 }
3266 }
3267
3268
3269 /*******************************************************************************
3270 *
3271 * FUNCTION: AcpiDmDumpSrat
3272 *
3273 * PARAMETERS: Table - A SRAT table
3274 *
3275 * RETURN: None
3276 *
3277 * DESCRIPTION: Format the contents of a SRAT
3278 *
3279 ******************************************************************************/
3280
3281 void
3282 AcpiDmDumpSrat (
3283 ACPI_TABLE_HEADER *Table)
3284 {
3285 ACPI_STATUS Status;
3286 UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
3287 ACPI_SUBTABLE_HEADER *SubTable;
3288 ACPI_DMTABLE_INFO *InfoTable;
3289
3290
3291 /* Main table */
3292
3293 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
3294 if (ACPI_FAILURE (Status))
3295 {
3296 return;
3297 }
3298
3299 /* Subtables */
3300
3301 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
3302 while (Offset < Table->Length)
3303 {
3304 /* Common subtable header */
3305
3306 AcpiOsPrintf ("\n");
3307 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3308 SubTable->Length, AcpiDmTableInfoSratHdr);
3309 if (ACPI_FAILURE (Status))
3310 {
3311 return;
3312 }
3313
3314 switch (SubTable->Type)
3315 {
3316 case ACPI_SRAT_TYPE_CPU_AFFINITY:
3317
3318 InfoTable = AcpiDmTableInfoSrat0;
3319 break;
3320
3321 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
3322
3323 InfoTable = AcpiDmTableInfoSrat1;
3324 break;
3325
3326 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
3327
3328 InfoTable = AcpiDmTableInfoSrat2;
3329 break;
3330
3331 case ACPI_SRAT_TYPE_GICC_AFFINITY:
3332
3333 InfoTable = AcpiDmTableInfoSrat3;
3334 break;
3335
3336 default:
3337 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", SubTable->Type);
3338
3339 /* Attempt to continue */
3340
3341 if (!SubTable->Length)
3342 {
3343 AcpiOsPrintf ("Invalid zero length subtable\n");
3344 return;
3345 }
3346 goto NextSubTable;
3347 }
3348
3349 AcpiOsPrintf ("\n");
3350 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3351 SubTable->Length, InfoTable);
3352 if (ACPI_FAILURE (Status))
3353 {
3354 return;
3355 }
3356
3357 NextSubTable:
3358 /* Point to next subtable */
3359
3360 Offset += SubTable->Length;
3361 SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
3362 }
3363 }
3364
3365
3366 /*******************************************************************************
3367 *
3368 * FUNCTION: AcpiDmDumpStao
3369 *
3370 * PARAMETERS: Table - A STAO table
3371 *
3372 * RETURN: None
3373 *
3374 * DESCRIPTION: Format the contents of a STAO. This is a variable-length
3375 * table that contains an open-ended number of ASCII strings
3376 * at the end of the table.
3377 *
3378 ******************************************************************************/
3379
3380 void
3381 AcpiDmDumpStao (
3382 ACPI_TABLE_HEADER *Table)
3383 {
3384 ACPI_STATUS Status;
3385 char *Namepath;
3386 UINT32 Length = Table->Length;
3387 UINT32 StringLength;
3388 UINT32 Offset = sizeof (ACPI_TABLE_STAO);
3389
3390
3391 /* Main table */
3392
3393 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
3394 if (ACPI_FAILURE (Status))
3395 {
3396 return;
3397 }
3398
3399 /* The rest of the table consists of Namepath strings */
3400
3401 while (Offset < Table->Length)
3402 {
3403 Namepath = ACPI_ADD_PTR (char, Table, Offset);
3404 StringLength = strlen (Namepath) + 1;
3405
3406 AcpiDmLineHeader (Offset, StringLength, "Namestring");
3407 AcpiOsPrintf ("\"%s\"\n", Namepath);
3408
3409 /* Point to next namepath */
3410
3411 Offset += StringLength;
3412 }
3413 }
3414
3415
3416 /*******************************************************************************
3417 *
3418 * FUNCTION: AcpiDmDumpTcpa
3419 *
3420 * PARAMETERS: Table - A TCPA table
3421 *
3422 * RETURN: None
3423 *
3424 * DESCRIPTION: Format the contents of a TCPA.
3425 *
3426 * NOTE: There are two versions of the table with the same signature:
3427 * the client version and the server version. The common
3428 * PlatformClass field is used to differentiate the two types of
3429 * tables.
3430 *
3431 ******************************************************************************/
3432
3433 void
3434 AcpiDmDumpTcpa (
3435 ACPI_TABLE_HEADER *Table)
3436 {
3437 UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR);
3438 ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR (
3439 ACPI_TABLE_TCPA_HDR, Table);
3440 ACPI_TABLE_TCPA_HDR *SubTable = ACPI_ADD_PTR (
3441 ACPI_TABLE_TCPA_HDR, Table, Offset);
3442 ACPI_STATUS Status;
3443
3444
3445 /* Main table */
3446
3447 Status = AcpiDmDumpTable (Table->Length, 0, Table,
3448 0, AcpiDmTableInfoTcpaHdr);
3449 if (ACPI_FAILURE (Status))
3450 {
3451 return;
3452 }
3453
3454 /*
3455 * Examine the PlatformClass field to determine the table type.
3456 * Either a client or server table. Only one.
3457 */
3458 switch (CommonHeader->PlatformClass)
3459 {
3460 case ACPI_TCPA_CLIENT_TABLE:
3461
3462 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3463 Table->Length - Offset, AcpiDmTableInfoTcpaClient);
3464 break;
3465
3466 case ACPI_TCPA_SERVER_TABLE:
3467
3468 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3469 Table->Length - Offset, AcpiDmTableInfoTcpaServer);
3470 break;
3471
3472 default:
3473
3474 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
3475 CommonHeader->PlatformClass);
3476 Status = AE_ERROR;
3477 break;
3478 }
3479
3480 if (ACPI_FAILURE (Status))
3481 {
3482 AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
3483 }
3484 }
3485
3486
3487 /*******************************************************************************
3488 *
3489 * FUNCTION: AcpiDmDumpVrtc
3490 *
3491 * PARAMETERS: Table - A VRTC table
3492 *
3493 * RETURN: None
3494 *
3495 * DESCRIPTION: Format the contents of a VRTC
3496 *
3497 ******************************************************************************/
3498
3499 void
3500 AcpiDmDumpVrtc (
3501 ACPI_TABLE_HEADER *Table)
3502 {
3503 ACPI_STATUS Status;
3504 UINT32 Offset = sizeof (ACPI_TABLE_VRTC);
3505 ACPI_VRTC_ENTRY *SubTable;
3506
3507
3508 /* Main table */
3509
3510 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
3511 if (ACPI_FAILURE (Status))
3512 {
3513 return;
3514 }
3515
3516 /* Subtables */
3517
3518 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
3519 while (Offset < Table->Length)
3520 {
3521 /* Common subtable header */
3522
3523 AcpiOsPrintf ("\n");
3524 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3525 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
3526 if (ACPI_FAILURE (Status))
3527 {
3528 return;
3529 }
3530
3531 /* Point to next subtable */
3532
3533 Offset += sizeof (ACPI_VRTC_ENTRY);
3534 SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, sizeof (ACPI_VRTC_ENTRY));
3535 }
3536 }
3537
3538
3539 /*******************************************************************************
3540 *
3541 * FUNCTION: AcpiDmDumpWdat
3542 *
3543 * PARAMETERS: Table - A WDAT table
3544 *
3545 * RETURN: None
3546 *
3547 * DESCRIPTION: Format the contents of a WDAT
3548 *
3549 ******************************************************************************/
3550
3551 void
3552 AcpiDmDumpWdat (
3553 ACPI_TABLE_HEADER *Table)
3554 {
3555 ACPI_STATUS Status;
3556 UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
3557 ACPI_WDAT_ENTRY *SubTable;
3558
3559
3560 /* Main table */
3561
3562 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
3563 if (ACPI_FAILURE (Status))
3564 {
3565 return;
3566 }
3567
3568 /* Subtables */
3569
3570 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
3571 while (Offset < Table->Length)
3572 {
3573 /* Common subtable header */
3574
3575 AcpiOsPrintf ("\n");
3576 Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
3577 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
3578 if (ACPI_FAILURE (Status))
3579 {
3580 return;
3581 }
3582
3583 /* Point to next subtable */
3584
3585 Offset += sizeof (ACPI_WDAT_ENTRY);
3586 SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, sizeof (ACPI_WDAT_ENTRY));
3587 }
3588 }
3589
3590 /*******************************************************************************
3591 *
3592 * FUNCTION: AcpiDmDumpWpbt
3593 *
3594 * PARAMETERS: Table - A WPBT table
3595 *
3596 * RETURN: None
3597 *
3598 * DESCRIPTION: Format the contents of a WPBT. This table type consists
3599 * of an open-ended arguments buffer at the end of the table.
3600 *
3601 ******************************************************************************/
3602
3603 void
3604 AcpiDmDumpWpbt (
3605 ACPI_TABLE_HEADER *Table)
3606 {
3607 ACPI_STATUS Status;
3608 ACPI_TABLE_WPBT *SubTable;
3609 UINT32 Length = Table->Length;
3610 UINT16 ArgumentsLength;
3611
3612
3613 /* Dump the main table */
3614
3615 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
3616 if (ACPI_FAILURE (Status))
3617 {
3618 return;
3619 }
3620
3621 /* Extract the arguments buffer length from the main table */
3622
3623 SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
3624 ArgumentsLength = SubTable->ArgumentsLength;
3625
3626 /* Dump the arguments buffer */
3627
3628 (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
3629 AcpiDmTableInfoWpbt0);
3630 }
3631