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