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