dmtbdump1.c revision 1.1.1.3 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2019, 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 ("dmtbdump1")
53
54
55 /*******************************************************************************
56 *
57 * FUNCTION: AcpiDmDumpAsf
58 *
59 * PARAMETERS: Table - A ASF table
60 *
61 * RETURN: None
62 *
63 * DESCRIPTION: Format the contents of a ASF table
64 *
65 ******************************************************************************/
66
67 void
68 AcpiDmDumpAsf (
69 ACPI_TABLE_HEADER *Table)
70 {
71 ACPI_STATUS Status;
72 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
73 ACPI_ASF_INFO *Subtable;
74 ACPI_DMTABLE_INFO *InfoTable;
75 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
76 UINT8 *DataTable = NULL;
77 UINT32 DataCount = 0;
78 UINT32 DataLength = 0;
79 UINT32 DataOffset = 0;
80 UINT32 i;
81 UINT8 Type;
82
83
84 /* No main table, only subtables */
85
86 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
87 while (Offset < Table->Length)
88 {
89 /* Common subtable header */
90
91 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
92 Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
93 if (ACPI_FAILURE (Status))
94 {
95 return;
96 }
97
98 /* The actual type is the lower 7 bits of Type */
99
100 Type = (UINT8) (Subtable->Header.Type & 0x7F);
101
102 switch (Type)
103 {
104 case ACPI_ASF_TYPE_INFO:
105
106 InfoTable = AcpiDmTableInfoAsf0;
107 break;
108
109 case ACPI_ASF_TYPE_ALERT:
110
111 InfoTable = AcpiDmTableInfoAsf1;
112 DataInfoTable = AcpiDmTableInfoAsf1a;
113 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
114 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
115 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
116 DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
117 break;
118
119 case ACPI_ASF_TYPE_CONTROL:
120
121 InfoTable = AcpiDmTableInfoAsf2;
122 DataInfoTable = AcpiDmTableInfoAsf2a;
123 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
124 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
125 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
126 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
127 break;
128
129 case ACPI_ASF_TYPE_BOOT:
130
131 InfoTable = AcpiDmTableInfoAsf3;
132 break;
133
134 case ACPI_ASF_TYPE_ADDRESS:
135
136 InfoTable = AcpiDmTableInfoAsf4;
137 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
138 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
139 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
140 break;
141
142 default:
143
144 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
145 Subtable->Header.Type);
146 return;
147 }
148
149 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
150 Subtable->Header.Length, InfoTable);
151 if (ACPI_FAILURE (Status))
152 {
153 return;
154 }
155
156 /* Dump variable-length extra data */
157
158 switch (Type)
159 {
160 case ACPI_ASF_TYPE_ALERT:
161 case ACPI_ASF_TYPE_CONTROL:
162
163 for (i = 0; i < DataCount; i++)
164 {
165 AcpiOsPrintf ("\n");
166 Status = AcpiDmDumpTable (Table->Length, DataOffset,
167 DataTable, DataLength, DataInfoTable);
168 if (ACPI_FAILURE (Status))
169 {
170 return;
171 }
172
173 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
174 DataOffset += DataLength;
175 }
176 break;
177
178 case ACPI_ASF_TYPE_ADDRESS:
179
180 for (i = 0; i < DataLength; i++)
181 {
182 if (!(i % 16))
183 {
184 AcpiDmLineHeader (DataOffset, 1, "Addresses");
185 }
186
187 AcpiOsPrintf ("%2.2X ", *DataTable);
188 DataTable++;
189 DataOffset++;
190
191 if (DataOffset > Table->Length)
192 {
193 AcpiOsPrintf (
194 "**** ACPI table terminates in the middle of a "
195 "data structure! (ASF! table)\n");
196 return;
197 }
198 }
199
200 AcpiOsPrintf ("\n");
201 break;
202
203 default:
204
205 break;
206 }
207
208 AcpiOsPrintf ("\n");
209
210 /* Point to next subtable */
211
212 if (!Subtable->Header.Length)
213 {
214 AcpiOsPrintf ("Invalid zero subtable header length\n");
215 return;
216 }
217
218 Offset += Subtable->Header.Length;
219 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
220 Subtable->Header.Length);
221 }
222 }
223
224
225 /*******************************************************************************
226 *
227 * FUNCTION: AcpiDmDumpCpep
228 *
229 * PARAMETERS: Table - A CPEP table
230 *
231 * RETURN: None
232 *
233 * DESCRIPTION: Format the contents of a CPEP. This table type consists
234 * of an open-ended number of subtables.
235 *
236 ******************************************************************************/
237
238 void
239 AcpiDmDumpCpep (
240 ACPI_TABLE_HEADER *Table)
241 {
242 ACPI_STATUS Status;
243 ACPI_CPEP_POLLING *Subtable;
244 UINT32 Length = Table->Length;
245 UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
246
247
248 /* Main table */
249
250 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
251 if (ACPI_FAILURE (Status))
252 {
253 return;
254 }
255
256 /* Subtables */
257
258 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
259 while (Offset < Table->Length)
260 {
261 AcpiOsPrintf ("\n");
262 Status = AcpiDmDumpTable (Length, Offset, Subtable,
263 Subtable->Header.Length, AcpiDmTableInfoCpep0);
264 if (ACPI_FAILURE (Status))
265 {
266 return;
267 }
268
269 /* Point to next subtable */
270
271 Offset += Subtable->Header.Length;
272 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
273 Subtable->Header.Length);
274 }
275 }
276
277
278 /*******************************************************************************
279 *
280 * FUNCTION: AcpiDmDumpCsrt
281 *
282 * PARAMETERS: Table - A CSRT table
283 *
284 * RETURN: None
285 *
286 * DESCRIPTION: Format the contents of a CSRT. This table type consists
287 * of an open-ended number of subtables.
288 *
289 ******************************************************************************/
290
291 void
292 AcpiDmDumpCsrt (
293 ACPI_TABLE_HEADER *Table)
294 {
295 ACPI_STATUS Status;
296 ACPI_CSRT_GROUP *Subtable;
297 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
298 ACPI_CSRT_DESCRIPTOR *SubSubtable;
299 UINT32 Length = Table->Length;
300 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
301 UINT32 SubOffset;
302 UINT32 SubSubOffset;
303 UINT32 InfoLength;
304
305
306 /* The main table only contains the ACPI header, thus already handled */
307
308 /* Subtables (Resource Groups) */
309
310 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
311 while (Offset < Table->Length)
312 {
313 /* Resource group subtable */
314
315 AcpiOsPrintf ("\n");
316 Status = AcpiDmDumpTable (Length, Offset, Subtable,
317 Subtable->Length, AcpiDmTableInfoCsrt0);
318 if (ACPI_FAILURE (Status))
319 {
320 return;
321 }
322
323 /* Shared info subtable (One per resource group) */
324
325 SubOffset = sizeof (ACPI_CSRT_GROUP);
326 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
327 Offset + SubOffset);
328
329 AcpiOsPrintf ("\n");
330 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
331 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
332 if (ACPI_FAILURE (Status))
333 {
334 return;
335 }
336
337 SubOffset += Subtable->SharedInfoLength;
338
339 /* Sub-Subtables (Resource Descriptors) */
340
341 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
342 Offset + SubOffset);
343
344 while ((SubOffset < Subtable->Length) &&
345 ((Offset + SubOffset) < Table->Length))
346 {
347 AcpiOsPrintf ("\n");
348 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
349 SubSubtable->Length, AcpiDmTableInfoCsrt2);
350 if (ACPI_FAILURE (Status))
351 {
352 return;
353 }
354
355 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
356
357 /* Resource-specific info buffer */
358
359 InfoLength = SubSubtable->Length - SubSubOffset;
360 if (InfoLength)
361 {
362 Status = AcpiDmDumpTable (Length,
363 Offset + SubOffset + SubSubOffset, Table,
364 InfoLength, AcpiDmTableInfoCsrt2a);
365 if (ACPI_FAILURE (Status))
366 {
367 return;
368 }
369 }
370
371 /* Point to next sub-subtable */
372
373 SubOffset += SubSubtable->Length;
374 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
375 SubSubtable->Length);
376 }
377
378 /* Point to next subtable */
379
380 Offset += Subtable->Length;
381 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
382 Subtable->Length);
383 }
384 }
385
386
387 /*******************************************************************************
388 *
389 * FUNCTION: AcpiDmDumpDbg2
390 *
391 * PARAMETERS: Table - A DBG2 table
392 *
393 * RETURN: None
394 *
395 * DESCRIPTION: Format the contents of a DBG2. This table type consists
396 * of an open-ended number of subtables.
397 *
398 ******************************************************************************/
399
400 void
401 AcpiDmDumpDbg2 (
402 ACPI_TABLE_HEADER *Table)
403 {
404 ACPI_STATUS Status;
405 ACPI_DBG2_DEVICE *Subtable;
406 UINT32 Length = Table->Length;
407 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
408 UINT32 i;
409 UINT32 ArrayOffset;
410 UINT32 AbsoluteOffset;
411 UINT8 *Array;
412
413
414 /* Main table */
415
416 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
417 if (ACPI_FAILURE (Status))
418 {
419 return;
420 }
421
422 /* Subtables */
423
424 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
425 while (Offset < Table->Length)
426 {
427 AcpiOsPrintf ("\n");
428 Status = AcpiDmDumpTable (Length, Offset, Subtable,
429 Subtable->Length, AcpiDmTableInfoDbg2Device);
430 if (ACPI_FAILURE (Status))
431 {
432 return;
433 }
434
435 /* Dump the BaseAddress array */
436
437 for (i = 0; i < Subtable->RegisterCount; i++)
438 {
439 ArrayOffset = Subtable->BaseAddressOffset +
440 (sizeof (ACPI_GENERIC_ADDRESS) * i);
441 AbsoluteOffset = Offset + ArrayOffset;
442 Array = (UINT8 *) Subtable + ArrayOffset;
443
444 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
445 Subtable->Length, AcpiDmTableInfoDbg2Addr);
446 if (ACPI_FAILURE (Status))
447 {
448 return;
449 }
450 }
451
452 /* Dump the AddressSize array */
453
454 for (i = 0; i < Subtable->RegisterCount; i++)
455 {
456 ArrayOffset = Subtable->AddressSizeOffset +
457 (sizeof (UINT32) * i);
458 AbsoluteOffset = Offset + ArrayOffset;
459 Array = (UINT8 *) Subtable + ArrayOffset;
460
461 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
462 Subtable->Length, AcpiDmTableInfoDbg2Size);
463 if (ACPI_FAILURE (Status))
464 {
465 return;
466 }
467 }
468
469 /* Dump the Namestring (required) */
470
471 AcpiOsPrintf ("\n");
472 ArrayOffset = Subtable->NamepathOffset;
473 AbsoluteOffset = Offset + ArrayOffset;
474 Array = (UINT8 *) Subtable + ArrayOffset;
475
476 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
477 Subtable->Length, AcpiDmTableInfoDbg2Name);
478 if (ACPI_FAILURE (Status))
479 {
480 return;
481 }
482
483 /* Dump the OemData (optional) */
484
485 if (Subtable->OemDataOffset)
486 {
487 Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
488 Table, Subtable->OemDataLength,
489 AcpiDmTableInfoDbg2OemData);
490 if (ACPI_FAILURE (Status))
491 {
492 return;
493 }
494 }
495
496 /* Point to next subtable */
497
498 Offset += Subtable->Length;
499 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
500 Subtable->Length);
501 }
502 }
503
504
505 /*******************************************************************************
506 *
507 * FUNCTION: AcpiDmDumpDmar
508 *
509 * PARAMETERS: Table - A DMAR table
510 *
511 * RETURN: None
512 *
513 * DESCRIPTION: Format the contents of a DMAR. This table type consists
514 * of an open-ended number of subtables.
515 *
516 ******************************************************************************/
517
518 void
519 AcpiDmDumpDmar (
520 ACPI_TABLE_HEADER *Table)
521 {
522 ACPI_STATUS Status;
523 ACPI_DMAR_HEADER *Subtable;
524 UINT32 Length = Table->Length;
525 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
526 ACPI_DMTABLE_INFO *InfoTable;
527 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
528 UINT32 ScopeOffset;
529 UINT8 *PciPath;
530 UINT32 PathOffset;
531
532
533 /* Main table */
534
535 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
536 if (ACPI_FAILURE (Status))
537 {
538 return;
539 }
540
541 /* Subtables */
542
543 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
544 while (Offset < Table->Length)
545 {
546 /* Common subtable header */
547
548 AcpiOsPrintf ("\n");
549 Status = AcpiDmDumpTable (Length, Offset, Subtable,
550 Subtable->Length, AcpiDmTableInfoDmarHdr);
551 if (ACPI_FAILURE (Status))
552 {
553 return;
554 }
555
556 AcpiOsPrintf ("\n");
557
558 switch (Subtable->Type)
559 {
560 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
561
562 InfoTable = AcpiDmTableInfoDmar0;
563 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
564 break;
565
566 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
567
568 InfoTable = AcpiDmTableInfoDmar1;
569 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
570 break;
571
572 case ACPI_DMAR_TYPE_ROOT_ATS:
573
574 InfoTable = AcpiDmTableInfoDmar2;
575 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
576 break;
577
578 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
579
580 InfoTable = AcpiDmTableInfoDmar3;
581 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
582 break;
583
584 case ACPI_DMAR_TYPE_NAMESPACE:
585
586 InfoTable = AcpiDmTableInfoDmar4;
587 ScopeOffset = sizeof (ACPI_DMAR_ANDD);
588 break;
589
590 default:
591
592 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
593 Subtable->Type);
594 return;
595 }
596
597 Status = AcpiDmDumpTable (Length, Offset, Subtable,
598 Subtable->Length, InfoTable);
599 if (ACPI_FAILURE (Status))
600 {
601 return;
602 }
603
604 /*
605 * Dump the optional device scope entries
606 */
607 if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
608 (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
609 {
610 /* These types do not support device scopes */
611
612 goto NextSubtable;
613 }
614
615 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
616 while (ScopeOffset < Subtable->Length)
617 {
618 AcpiOsPrintf ("\n");
619 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
620 ScopeTable->Length, AcpiDmTableInfoDmarScope);
621 if (ACPI_FAILURE (Status))
622 {
623 return;
624 }
625 AcpiOsPrintf ("\n");
626
627 /* Dump the PCI Path entries for this device scope */
628
629 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
630
631 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
632 sizeof (ACPI_DMAR_DEVICE_SCOPE));
633
634 while (PathOffset < ScopeTable->Length)
635 {
636 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
637 "PCI Path");
638 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
639
640 /* Point to next PCI Path entry */
641
642 PathOffset += 2;
643 PciPath += 2;
644 AcpiOsPrintf ("\n");
645 }
646
647 /* Point to next device scope entry */
648
649 ScopeOffset += ScopeTable->Length;
650 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
651 ScopeTable, ScopeTable->Length);
652 }
653
654 NextSubtable:
655 /* Point to next subtable */
656
657 Offset += Subtable->Length;
658 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
659 Subtable->Length);
660 }
661 }
662
663
664 /*******************************************************************************
665 *
666 * FUNCTION: AcpiDmDumpDrtm
667 *
668 * PARAMETERS: Table - A DRTM table
669 *
670 * RETURN: None
671 *
672 * DESCRIPTION: Format the contents of a DRTM.
673 *
674 ******************************************************************************/
675
676 void
677 AcpiDmDumpDrtm (
678 ACPI_TABLE_HEADER *Table)
679 {
680 ACPI_STATUS Status;
681 UINT32 Offset;
682 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
683 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
684 ACPI_DRTM_DPS_ID *DrtmDps;
685 UINT32 Count;
686
687
688 /* Main table */
689
690 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
691 AcpiDmTableInfoDrtm);
692 if (ACPI_FAILURE (Status))
693 {
694 return;
695 }
696
697 Offset = sizeof (ACPI_TABLE_DRTM);
698
699 /* Sub-tables */
700
701 /* Dump ValidatedTable length */
702
703 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
704 AcpiOsPrintf ("\n");
705 Status = AcpiDmDumpTable (Table->Length, Offset,
706 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
707 AcpiDmTableInfoDrtm0);
708 if (ACPI_FAILURE (Status))
709 {
710 return;
711 }
712
713 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
714
715 /* Dump Validated table addresses */
716
717 Count = 0;
718 while ((Offset < Table->Length) &&
719 (DrtmVtl->ValidatedTableCount > Count))
720 {
721 Status = AcpiDmDumpTable (Table->Length, Offset,
722 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
723 AcpiDmTableInfoDrtm0a);
724 if (ACPI_FAILURE (Status))
725 {
726 return;
727 }
728
729 Offset += sizeof (UINT64);
730 Count++;
731 }
732
733 /* Dump ResourceList length */
734
735 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
736 AcpiOsPrintf ("\n");
737 Status = AcpiDmDumpTable (Table->Length, Offset,
738 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
739 AcpiDmTableInfoDrtm1);
740 if (ACPI_FAILURE (Status))
741 {
742 return;
743 }
744
745 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
746
747 /* Dump the Resource List */
748
749 Count = 0;
750 while ((Offset < Table->Length) &&
751 (DrtmRl->ResourceCount > Count))
752 {
753 Status = AcpiDmDumpTable (Table->Length, Offset,
754 ACPI_ADD_PTR (void, Table, Offset),
755 sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
756 if (ACPI_FAILURE (Status))
757 {
758 return;
759 }
760
761 Offset += sizeof (ACPI_DRTM_RESOURCE);
762 Count++;
763 }
764
765 /* Dump DPS */
766
767 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
768 AcpiOsPrintf ("\n");
769 (void) AcpiDmDumpTable (Table->Length, Offset,
770 DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
771 }
772
773
774 /*******************************************************************************
775 *
776 * FUNCTION: AcpiDmDumpEinj
777 *
778 * PARAMETERS: Table - A EINJ table
779 *
780 * RETURN: None
781 *
782 * DESCRIPTION: Format the contents of a EINJ. This table type consists
783 * of an open-ended number of subtables.
784 *
785 ******************************************************************************/
786
787 void
788 AcpiDmDumpEinj (
789 ACPI_TABLE_HEADER *Table)
790 {
791 ACPI_STATUS Status;
792 ACPI_WHEA_HEADER *Subtable;
793 UINT32 Length = Table->Length;
794 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
795
796
797 /* Main table */
798
799 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
800 if (ACPI_FAILURE (Status))
801 {
802 return;
803 }
804
805 /* Subtables */
806
807 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
808 while (Offset < Table->Length)
809 {
810 AcpiOsPrintf ("\n");
811 Status = AcpiDmDumpTable (Length, Offset, Subtable,
812 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
813 if (ACPI_FAILURE (Status))
814 {
815 return;
816 }
817
818 /* Point to next subtable (each subtable is of fixed length) */
819
820 Offset += sizeof (ACPI_WHEA_HEADER);
821 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
822 sizeof (ACPI_WHEA_HEADER));
823 }
824 }
825
826
827 /*******************************************************************************
828 *
829 * FUNCTION: AcpiDmDumpErst
830 *
831 * PARAMETERS: Table - A ERST table
832 *
833 * RETURN: None
834 *
835 * DESCRIPTION: Format the contents of a ERST. This table type consists
836 * of an open-ended number of subtables.
837 *
838 ******************************************************************************/
839
840 void
841 AcpiDmDumpErst (
842 ACPI_TABLE_HEADER *Table)
843 {
844 ACPI_STATUS Status;
845 ACPI_WHEA_HEADER *Subtable;
846 UINT32 Length = Table->Length;
847 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
848
849
850 /* Main table */
851
852 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
853 if (ACPI_FAILURE (Status))
854 {
855 return;
856 }
857
858 /* Subtables */
859
860 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
861 while (Offset < Table->Length)
862 {
863 AcpiOsPrintf ("\n");
864 Status = AcpiDmDumpTable (Length, Offset, Subtable,
865 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
866 if (ACPI_FAILURE (Status))
867 {
868 return;
869 }
870
871 /* Point to next subtable (each subtable is of fixed length) */
872
873 Offset += sizeof (ACPI_WHEA_HEADER);
874 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
875 sizeof (ACPI_WHEA_HEADER));
876 }
877 }
878
879
880 /*******************************************************************************
881 *
882 * FUNCTION: AcpiDmDumpFpdt
883 *
884 * PARAMETERS: Table - A FPDT table
885 *
886 * RETURN: None
887 *
888 * DESCRIPTION: Format the contents of a FPDT. This table type consists
889 * of an open-ended number of subtables.
890 *
891 ******************************************************************************/
892
893 void
894 AcpiDmDumpFpdt (
895 ACPI_TABLE_HEADER *Table)
896 {
897 ACPI_STATUS Status;
898 ACPI_FPDT_HEADER *Subtable;
899 UINT32 Length = Table->Length;
900 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
901 ACPI_DMTABLE_INFO *InfoTable;
902
903
904 /* There is no main table (other than the standard ACPI header) */
905
906 /* Subtables */
907
908 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
909 while (Offset < Table->Length)
910 {
911 /* Common subtable header */
912
913 AcpiOsPrintf ("\n");
914 Status = AcpiDmDumpTable (Length, Offset, Subtable,
915 Subtable->Length, AcpiDmTableInfoFpdtHdr);
916 if (ACPI_FAILURE (Status))
917 {
918 return;
919 }
920
921 switch (Subtable->Type)
922 {
923 case ACPI_FPDT_TYPE_BOOT:
924
925 InfoTable = AcpiDmTableInfoFpdt0;
926 break;
927
928 case ACPI_FPDT_TYPE_S3PERF:
929
930 InfoTable = AcpiDmTableInfoFpdt1;
931 break;
932
933 default:
934
935 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
936 Subtable->Type);
937
938 /* Attempt to continue */
939
940 if (!Subtable->Length)
941 {
942 AcpiOsPrintf ("Invalid zero length subtable\n");
943 return;
944 }
945 goto NextSubtable;
946 }
947
948 Status = AcpiDmDumpTable (Length, Offset, Subtable,
949 Subtable->Length, InfoTable);
950 if (ACPI_FAILURE (Status))
951 {
952 return;
953 }
954
955 NextSubtable:
956 /* Point to next subtable */
957
958 Offset += Subtable->Length;
959 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
960 Subtable->Length);
961 }
962 }
963
964
965 /*******************************************************************************
966 *
967 * FUNCTION: AcpiDmDumpGtdt
968 *
969 * PARAMETERS: Table - A GTDT table
970 *
971 * RETURN: None
972 *
973 * DESCRIPTION: Format the contents of a GTDT. This table type consists
974 * of an open-ended number of subtables.
975 *
976 ******************************************************************************/
977
978 void
979 AcpiDmDumpGtdt (
980 ACPI_TABLE_HEADER *Table)
981 {
982 ACPI_STATUS Status;
983 ACPI_GTDT_HEADER *Subtable;
984 UINT32 Length = Table->Length;
985 UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
986 ACPI_DMTABLE_INFO *InfoTable;
987 UINT32 SubtableLength;
988 UINT32 GtCount;
989 ACPI_GTDT_TIMER_ENTRY *GtxTable;
990
991
992 /* Main table */
993
994 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
995 if (ACPI_FAILURE (Status))
996 {
997 return;
998 }
999
1000 /* Rev 3 fields */
1001
1002 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1003
1004 if (Table->Revision > 2)
1005 {
1006 SubtableLength = sizeof (ACPI_GTDT_EL2);
1007 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1008 SubtableLength, AcpiDmTableInfoGtdtEl2);
1009 if (ACPI_FAILURE (Status))
1010 {
1011 return;
1012 }
1013 Offset += SubtableLength;
1014 }
1015
1016 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1017
1018 /* Subtables */
1019
1020 while (Offset < Table->Length)
1021 {
1022 /* Common subtable header */
1023
1024 AcpiOsPrintf ("\n");
1025 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1026 Subtable->Length, AcpiDmTableInfoGtdtHdr);
1027 if (ACPI_FAILURE (Status))
1028 {
1029 return;
1030 }
1031
1032 GtCount = 0;
1033 switch (Subtable->Type)
1034 {
1035 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1036
1037 SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1038 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1039 Subtable))->TimerCount;
1040
1041 InfoTable = AcpiDmTableInfoGtdt0;
1042 break;
1043
1044 case ACPI_GTDT_TYPE_WATCHDOG:
1045
1046 SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
1047
1048 InfoTable = AcpiDmTableInfoGtdt1;
1049 break;
1050
1051 default:
1052
1053 /* Cannot continue on unknown type - no length */
1054
1055 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1056 Subtable->Type);
1057 return;
1058 }
1059
1060 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1061 Subtable->Length, InfoTable);
1062 if (ACPI_FAILURE (Status))
1063 {
1064 return;
1065 }
1066
1067 /* Point to end of current subtable (each subtable above is of fixed length) */
1068
1069 Offset += SubtableLength;
1070
1071 /* If there are any Gt Timer Blocks from above, dump them now */
1072
1073 if (GtCount)
1074 {
1075 GtxTable = ACPI_ADD_PTR (
1076 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
1077 SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1078
1079 while (GtCount)
1080 {
1081 AcpiOsPrintf ("\n");
1082 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1083 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1084 if (ACPI_FAILURE (Status))
1085 {
1086 return;
1087 }
1088 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1089 GtxTable++;
1090 GtCount--;
1091 }
1092 }
1093
1094 /* Point to next subtable */
1095
1096 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
1097 }
1098 }
1099
1100
1101 /*******************************************************************************
1102 *
1103 * FUNCTION: AcpiDmDumpHest
1104 *
1105 * PARAMETERS: Table - A HEST table
1106 *
1107 * RETURN: None
1108 *
1109 * DESCRIPTION: Format the contents of a HEST. This table type consists
1110 * of an open-ended number of subtables.
1111 *
1112 ******************************************************************************/
1113
1114 void
1115 AcpiDmDumpHest (
1116 ACPI_TABLE_HEADER *Table)
1117 {
1118 ACPI_STATUS Status;
1119 ACPI_HEST_HEADER *Subtable;
1120 UINT32 Length = Table->Length;
1121 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1122 ACPI_DMTABLE_INFO *InfoTable;
1123 UINT32 SubtableLength;
1124 UINT32 BankCount;
1125 ACPI_HEST_IA_ERROR_BANK *BankTable;
1126
1127
1128 /* Main table */
1129
1130 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1131 if (ACPI_FAILURE (Status))
1132 {
1133 return;
1134 }
1135
1136 /* Subtables */
1137
1138 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1139 while (Offset < Table->Length)
1140 {
1141 BankCount = 0;
1142 switch (Subtable->Type)
1143 {
1144 case ACPI_HEST_TYPE_IA32_CHECK:
1145
1146 InfoTable = AcpiDmTableInfoHest0;
1147 SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1148 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1149 Subtable))->NumHardwareBanks;
1150 break;
1151
1152 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1153
1154 InfoTable = AcpiDmTableInfoHest1;
1155 SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1156 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1157 Subtable))->NumHardwareBanks;
1158 break;
1159
1160 case ACPI_HEST_TYPE_IA32_NMI:
1161
1162 InfoTable = AcpiDmTableInfoHest2;
1163 SubtableLength = sizeof (ACPI_HEST_IA_NMI);
1164 break;
1165
1166 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1167
1168 InfoTable = AcpiDmTableInfoHest6;
1169 SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
1170 break;
1171
1172 case ACPI_HEST_TYPE_AER_ENDPOINT:
1173
1174 InfoTable = AcpiDmTableInfoHest7;
1175 SubtableLength = sizeof (ACPI_HEST_AER);
1176 break;
1177
1178 case ACPI_HEST_TYPE_AER_BRIDGE:
1179
1180 InfoTable = AcpiDmTableInfoHest8;
1181 SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1182 break;
1183
1184 case ACPI_HEST_TYPE_GENERIC_ERROR:
1185
1186 InfoTable = AcpiDmTableInfoHest9;
1187 SubtableLength = sizeof (ACPI_HEST_GENERIC);
1188 break;
1189
1190 case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1191
1192 InfoTable = AcpiDmTableInfoHest10;
1193 SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
1194 break;
1195
1196 case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
1197
1198 InfoTable = AcpiDmTableInfoHest11;
1199 SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
1200 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
1201 Subtable))->NumHardwareBanks;
1202 break;
1203
1204 default:
1205
1206 /* Cannot continue on unknown type - no length */
1207
1208 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1209 Subtable->Type);
1210 return;
1211 }
1212
1213 AcpiOsPrintf ("\n");
1214 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1215 SubtableLength, InfoTable);
1216 if (ACPI_FAILURE (Status))
1217 {
1218 return;
1219 }
1220
1221 /* Point to end of current subtable (each subtable above is of fixed length) */
1222
1223 Offset += SubtableLength;
1224
1225 /* If there are any (fixed-length) Error Banks from above, dump them now */
1226
1227 if (BankCount)
1228 {
1229 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
1230 SubtableLength);
1231 SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1232
1233 while (BankCount)
1234 {
1235 AcpiOsPrintf ("\n");
1236 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1237 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1238 if (ACPI_FAILURE (Status))
1239 {
1240 return;
1241 }
1242
1243 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1244 BankTable++;
1245 BankCount--;
1246 }
1247 }
1248
1249 /* Point to next subtable */
1250
1251 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
1252 }
1253 }
1254
1255
1256 /*******************************************************************************
1257 *
1258 * FUNCTION: AcpiDmDumpHmat
1259 *
1260 * PARAMETERS: Table - A HMAT table
1261 *
1262 * RETURN: None
1263 *
1264 * DESCRIPTION: Format the contents of a HMAT.
1265 *
1266 ******************************************************************************/
1267
1268 void
1269 AcpiDmDumpHmat (
1270 ACPI_TABLE_HEADER *Table)
1271 {
1272 ACPI_STATUS Status;
1273 ACPI_HMAT_STRUCTURE *HmatStruct;
1274 ACPI_HMAT_LOCALITY *HmatLocality;
1275 ACPI_HMAT_CACHE *HmatCache;
1276 UINT32 Offset;
1277 UINT32 SubtableOffset;
1278 UINT32 Length;
1279 ACPI_DMTABLE_INFO *InfoTable;
1280 UINT32 i, j;
1281
1282
1283 /* Main table */
1284
1285 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
1286 if (ACPI_FAILURE (Status))
1287 {
1288 return;
1289 }
1290 Offset = sizeof (ACPI_TABLE_HMAT);
1291
1292 while (Offset < Table->Length)
1293 {
1294 AcpiOsPrintf ("\n");
1295
1296 /* Dump HMAT structure header */
1297
1298 HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
1299 if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
1300 {
1301 AcpiOsPrintf ("Invalid HMAT structure length\n");
1302 return;
1303 }
1304 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1305 HmatStruct->Length, AcpiDmTableInfoHmatHdr);
1306 if (ACPI_FAILURE (Status))
1307 {
1308 return;
1309 }
1310
1311 switch (HmatStruct->Type)
1312 {
1313 case ACPI_HMAT_TYPE_ADDRESS_RANGE:
1314
1315 InfoTable = AcpiDmTableInfoHmat0;
1316 Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
1317 break;
1318
1319 case ACPI_HMAT_TYPE_LOCALITY:
1320
1321 InfoTable = AcpiDmTableInfoHmat1;
1322 Length = sizeof (ACPI_HMAT_LOCALITY);
1323 break;
1324
1325 case ACPI_HMAT_TYPE_CACHE:
1326
1327 InfoTable = AcpiDmTableInfoHmat2;
1328 Length = sizeof (ACPI_HMAT_CACHE);
1329 break;
1330
1331 default:
1332
1333 AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
1334 HmatStruct->Type);
1335
1336 /* Attempt to continue */
1337
1338 goto NextSubtable;
1339 }
1340
1341 /* Dump HMAT structure body */
1342
1343 if (HmatStruct->Length < Length)
1344 {
1345 AcpiOsPrintf ("Invalid HMAT structure length\n");
1346 return;
1347 }
1348 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1349 HmatStruct->Length, InfoTable);
1350 if (ACPI_FAILURE (Status))
1351 {
1352 return;
1353 }
1354
1355 /* Dump HMAT structure additionals */
1356
1357 switch (HmatStruct->Type)
1358 {
1359 case ACPI_HMAT_TYPE_LOCALITY:
1360
1361 HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
1362 SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
1363
1364 /* Dump initiator proximity domains */
1365
1366 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1367 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
1368 {
1369 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
1370 return;
1371 }
1372 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1373 {
1374 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1375 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1376 4, AcpiDmTableInfoHmat1a);
1377 if (ACPI_FAILURE (Status))
1378 {
1379 return;
1380 }
1381
1382 SubtableOffset += 4;
1383 }
1384
1385 /* Dump target proximity domains */
1386
1387 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1388 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
1389 {
1390 AcpiOsPrintf ("Invalid target proximity domain number\n");
1391 return;
1392 }
1393 for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
1394 {
1395 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1396 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1397 4, AcpiDmTableInfoHmat1b);
1398 if (ACPI_FAILURE (Status))
1399 {
1400 return;
1401 }
1402
1403 SubtableOffset += 4;
1404 }
1405
1406 /* Dump latency/bandwidth entris */
1407
1408 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1409 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
1410 HmatLocality->NumberOfTargetPDs * 2))
1411 {
1412 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
1413 return;
1414 }
1415 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1416 {
1417 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
1418 {
1419 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1420 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1421 2, AcpiDmTableInfoHmat1c);
1422 if (ACPI_FAILURE(Status))
1423 {
1424 return;
1425 }
1426
1427 SubtableOffset += 2;
1428 }
1429 }
1430 break;
1431
1432 case ACPI_HMAT_TYPE_CACHE:
1433
1434 HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
1435 SubtableOffset = sizeof (ACPI_HMAT_CACHE);
1436
1437 /* Dump SMBIOS handles */
1438
1439 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1440 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
1441 {
1442 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
1443 return;
1444 }
1445 for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
1446 {
1447 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1448 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1449 2, AcpiDmTableInfoHmat2a);
1450 if (ACPI_FAILURE (Status))
1451 {
1452 return;
1453 }
1454
1455 SubtableOffset += 2;
1456 }
1457 break;
1458
1459 default:
1460
1461 break;
1462 }
1463
1464 NextSubtable:
1465 /* Point to next HMAT structure subtable */
1466
1467 Offset += (HmatStruct->Length);
1468 }
1469 }
1470