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