dmtbdump1.c revision 1.1 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2018, 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 SubSubOffset += InfoLength;
370 }
371
372 /* Point to next sub-subtable */
373
374 SubOffset += SubSubtable->Length;
375 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
376 SubSubtable->Length);
377 }
378
379 /* Point to next subtable */
380
381 Offset += Subtable->Length;
382 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
383 Subtable->Length);
384 }
385 }
386
387
388 /*******************************************************************************
389 *
390 * FUNCTION: AcpiDmDumpDbg2
391 *
392 * PARAMETERS: Table - A DBG2 table
393 *
394 * RETURN: None
395 *
396 * DESCRIPTION: Format the contents of a DBG2. This table type consists
397 * of an open-ended number of subtables.
398 *
399 ******************************************************************************/
400
401 void
402 AcpiDmDumpDbg2 (
403 ACPI_TABLE_HEADER *Table)
404 {
405 ACPI_STATUS Status;
406 ACPI_DBG2_DEVICE *Subtable;
407 UINT32 Length = Table->Length;
408 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
409 UINT32 i;
410 UINT32 ArrayOffset;
411 UINT32 AbsoluteOffset;
412 UINT8 *Array;
413
414
415 /* Main table */
416
417 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
418 if (ACPI_FAILURE (Status))
419 {
420 return;
421 }
422
423 /* Subtables */
424
425 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
426 while (Offset < Table->Length)
427 {
428 AcpiOsPrintf ("\n");
429 Status = AcpiDmDumpTable (Length, Offset, Subtable,
430 Subtable->Length, AcpiDmTableInfoDbg2Device);
431 if (ACPI_FAILURE (Status))
432 {
433 return;
434 }
435
436 /* Dump the BaseAddress array */
437
438 for (i = 0; i < Subtable->RegisterCount; i++)
439 {
440 ArrayOffset = Subtable->BaseAddressOffset +
441 (sizeof (ACPI_GENERIC_ADDRESS) * i);
442 AbsoluteOffset = Offset + ArrayOffset;
443 Array = (UINT8 *) Subtable + ArrayOffset;
444
445 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
446 Subtable->Length, AcpiDmTableInfoDbg2Addr);
447 if (ACPI_FAILURE (Status))
448 {
449 return;
450 }
451 }
452
453 /* Dump the AddressSize array */
454
455 for (i = 0; i < Subtable->RegisterCount; i++)
456 {
457 ArrayOffset = Subtable->AddressSizeOffset +
458 (sizeof (UINT32) * i);
459 AbsoluteOffset = Offset + ArrayOffset;
460 Array = (UINT8 *) Subtable + ArrayOffset;
461
462 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
463 Subtable->Length, AcpiDmTableInfoDbg2Size);
464 if (ACPI_FAILURE (Status))
465 {
466 return;
467 }
468 }
469
470 /* Dump the Namestring (required) */
471
472 AcpiOsPrintf ("\n");
473 ArrayOffset = Subtable->NamepathOffset;
474 AbsoluteOffset = Offset + ArrayOffset;
475 Array = (UINT8 *) Subtable + ArrayOffset;
476
477 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
478 Subtable->Length, AcpiDmTableInfoDbg2Name);
479 if (ACPI_FAILURE (Status))
480 {
481 return;
482 }
483
484 /* Dump the OemData (optional) */
485
486 if (Subtable->OemDataOffset)
487 {
488 Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
489 Table, Subtable->OemDataLength,
490 AcpiDmTableInfoDbg2OemData);
491 if (ACPI_FAILURE (Status))
492 {
493 return;
494 }
495 }
496
497 /* Point to next subtable */
498
499 Offset += Subtable->Length;
500 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
501 Subtable->Length);
502 }
503 }
504
505
506 /*******************************************************************************
507 *
508 * FUNCTION: AcpiDmDumpDmar
509 *
510 * PARAMETERS: Table - A DMAR table
511 *
512 * RETURN: None
513 *
514 * DESCRIPTION: Format the contents of a DMAR. This table type consists
515 * of an open-ended number of subtables.
516 *
517 ******************************************************************************/
518
519 void
520 AcpiDmDumpDmar (
521 ACPI_TABLE_HEADER *Table)
522 {
523 ACPI_STATUS Status;
524 ACPI_DMAR_HEADER *Subtable;
525 UINT32 Length = Table->Length;
526 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
527 ACPI_DMTABLE_INFO *InfoTable;
528 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
529 UINT32 ScopeOffset;
530 UINT8 *PciPath;
531 UINT32 PathOffset;
532
533
534 /* Main table */
535
536 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
537 if (ACPI_FAILURE (Status))
538 {
539 return;
540 }
541
542 /* Subtables */
543
544 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
545 while (Offset < Table->Length)
546 {
547 /* Common subtable header */
548
549 AcpiOsPrintf ("\n");
550 Status = AcpiDmDumpTable (Length, Offset, Subtable,
551 Subtable->Length, AcpiDmTableInfoDmarHdr);
552 if (ACPI_FAILURE (Status))
553 {
554 return;
555 }
556
557 AcpiOsPrintf ("\n");
558
559 switch (Subtable->Type)
560 {
561 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
562
563 InfoTable = AcpiDmTableInfoDmar0;
564 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
565 break;
566
567 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
568
569 InfoTable = AcpiDmTableInfoDmar1;
570 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
571 break;
572
573 case ACPI_DMAR_TYPE_ROOT_ATS:
574
575 InfoTable = AcpiDmTableInfoDmar2;
576 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
577 break;
578
579 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
580
581 InfoTable = AcpiDmTableInfoDmar3;
582 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
583 break;
584
585 case ACPI_DMAR_TYPE_NAMESPACE:
586
587 InfoTable = AcpiDmTableInfoDmar4;
588 ScopeOffset = sizeof (ACPI_DMAR_ANDD);
589 break;
590
591 default:
592
593 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
594 Subtable->Type);
595 return;
596 }
597
598 Status = AcpiDmDumpTable (Length, Offset, Subtable,
599 Subtable->Length, InfoTable);
600 if (ACPI_FAILURE (Status))
601 {
602 return;
603 }
604
605 /*
606 * Dump the optional device scope entries
607 */
608 if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
609 (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
610 {
611 /* These types do not support device scopes */
612
613 goto NextSubtable;
614 }
615
616 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
617 while (ScopeOffset < Subtable->Length)
618 {
619 AcpiOsPrintf ("\n");
620 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
621 ScopeTable->Length, AcpiDmTableInfoDmarScope);
622 if (ACPI_FAILURE (Status))
623 {
624 return;
625 }
626 AcpiOsPrintf ("\n");
627
628 /* Dump the PCI Path entries for this device scope */
629
630 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
631
632 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
633 sizeof (ACPI_DMAR_DEVICE_SCOPE));
634
635 while (PathOffset < ScopeTable->Length)
636 {
637 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
638 "PCI Path");
639 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
640
641 /* Point to next PCI Path entry */
642
643 PathOffset += 2;
644 PciPath += 2;
645 AcpiOsPrintf ("\n");
646 }
647
648 /* Point to next device scope entry */
649
650 ScopeOffset += ScopeTable->Length;
651 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
652 ScopeTable, ScopeTable->Length);
653 }
654
655 NextSubtable:
656 /* Point to next subtable */
657
658 Offset += Subtable->Length;
659 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
660 Subtable->Length);
661 }
662 }
663
664
665 /*******************************************************************************
666 *
667 * FUNCTION: AcpiDmDumpDrtm
668 *
669 * PARAMETERS: Table - A DRTM table
670 *
671 * RETURN: None
672 *
673 * DESCRIPTION: Format the contents of a DRTM.
674 *
675 ******************************************************************************/
676
677 void
678 AcpiDmDumpDrtm (
679 ACPI_TABLE_HEADER *Table)
680 {
681 ACPI_STATUS Status;
682 UINT32 Offset;
683 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
684 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
685 ACPI_DRTM_DPS_ID *DrtmDps;
686 UINT32 Count;
687
688
689 /* Main table */
690
691 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
692 AcpiDmTableInfoDrtm);
693 if (ACPI_FAILURE (Status))
694 {
695 return;
696 }
697
698 Offset = sizeof (ACPI_TABLE_DRTM);
699
700 /* Sub-tables */
701
702 /* Dump ValidatedTable length */
703
704 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
705 AcpiOsPrintf ("\n");
706 Status = AcpiDmDumpTable (Table->Length, Offset,
707 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
708 AcpiDmTableInfoDrtm0);
709 if (ACPI_FAILURE (Status))
710 {
711 return;
712 }
713
714 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
715
716 /* Dump Validated table addresses */
717
718 Count = 0;
719 while ((Offset < Table->Length) &&
720 (DrtmVtl->ValidatedTableCount > Count))
721 {
722 Status = AcpiDmDumpTable (Table->Length, Offset,
723 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
724 AcpiDmTableInfoDrtm0a);
725 if (ACPI_FAILURE (Status))
726 {
727 return;
728 }
729
730 Offset += sizeof (UINT64);
731 Count++;
732 }
733
734 /* Dump ResourceList length */
735
736 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
737 AcpiOsPrintf ("\n");
738 Status = AcpiDmDumpTable (Table->Length, Offset,
739 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
740 AcpiDmTableInfoDrtm1);
741 if (ACPI_FAILURE (Status))
742 {
743 return;
744 }
745
746 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
747
748 /* Dump the Resource List */
749
750 Count = 0;
751 while ((Offset < Table->Length) &&
752 (DrtmRl->ResourceCount > Count))
753 {
754 Status = AcpiDmDumpTable (Table->Length, Offset,
755 ACPI_ADD_PTR (void, Table, Offset),
756 sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
757 if (ACPI_FAILURE (Status))
758 {
759 return;
760 }
761
762 Offset += sizeof (ACPI_DRTM_RESOURCE);
763 Count++;
764 }
765
766 /* Dump DPS */
767
768 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
769 AcpiOsPrintf ("\n");
770 (void) AcpiDmDumpTable (Table->Length, Offset,
771 DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
772 }
773
774
775 /*******************************************************************************
776 *
777 * FUNCTION: AcpiDmDumpEinj
778 *
779 * PARAMETERS: Table - A EINJ table
780 *
781 * RETURN: None
782 *
783 * DESCRIPTION: Format the contents of a EINJ. This table type consists
784 * of an open-ended number of subtables.
785 *
786 ******************************************************************************/
787
788 void
789 AcpiDmDumpEinj (
790 ACPI_TABLE_HEADER *Table)
791 {
792 ACPI_STATUS Status;
793 ACPI_WHEA_HEADER *Subtable;
794 UINT32 Length = Table->Length;
795 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
796
797
798 /* Main table */
799
800 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
801 if (ACPI_FAILURE (Status))
802 {
803 return;
804 }
805
806 /* Subtables */
807
808 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
809 while (Offset < Table->Length)
810 {
811 AcpiOsPrintf ("\n");
812 Status = AcpiDmDumpTable (Length, Offset, Subtable,
813 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
814 if (ACPI_FAILURE (Status))
815 {
816 return;
817 }
818
819 /* Point to next subtable (each subtable is of fixed length) */
820
821 Offset += sizeof (ACPI_WHEA_HEADER);
822 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
823 sizeof (ACPI_WHEA_HEADER));
824 }
825 }
826
827
828 /*******************************************************************************
829 *
830 * FUNCTION: AcpiDmDumpErst
831 *
832 * PARAMETERS: Table - A ERST table
833 *
834 * RETURN: None
835 *
836 * DESCRIPTION: Format the contents of a ERST. This table type consists
837 * of an open-ended number of subtables.
838 *
839 ******************************************************************************/
840
841 void
842 AcpiDmDumpErst (
843 ACPI_TABLE_HEADER *Table)
844 {
845 ACPI_STATUS Status;
846 ACPI_WHEA_HEADER *Subtable;
847 UINT32 Length = Table->Length;
848 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
849
850
851 /* Main table */
852
853 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
854 if (ACPI_FAILURE (Status))
855 {
856 return;
857 }
858
859 /* Subtables */
860
861 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
862 while (Offset < Table->Length)
863 {
864 AcpiOsPrintf ("\n");
865 Status = AcpiDmDumpTable (Length, Offset, Subtable,
866 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
867 if (ACPI_FAILURE (Status))
868 {
869 return;
870 }
871
872 /* Point to next subtable (each subtable is of fixed length) */
873
874 Offset += sizeof (ACPI_WHEA_HEADER);
875 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
876 sizeof (ACPI_WHEA_HEADER));
877 }
878 }
879
880
881 /*******************************************************************************
882 *
883 * FUNCTION: AcpiDmDumpFpdt
884 *
885 * PARAMETERS: Table - A FPDT table
886 *
887 * RETURN: None
888 *
889 * DESCRIPTION: Format the contents of a FPDT. This table type consists
890 * of an open-ended number of subtables.
891 *
892 ******************************************************************************/
893
894 void
895 AcpiDmDumpFpdt (
896 ACPI_TABLE_HEADER *Table)
897 {
898 ACPI_STATUS Status;
899 ACPI_FPDT_HEADER *Subtable;
900 UINT32 Length = Table->Length;
901 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
902 ACPI_DMTABLE_INFO *InfoTable;
903
904
905 /* There is no main table (other than the standard ACPI header) */
906
907 /* Subtables */
908
909 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
910 while (Offset < Table->Length)
911 {
912 /* Common subtable header */
913
914 AcpiOsPrintf ("\n");
915 Status = AcpiDmDumpTable (Length, Offset, Subtable,
916 Subtable->Length, AcpiDmTableInfoFpdtHdr);
917 if (ACPI_FAILURE (Status))
918 {
919 return;
920 }
921
922 switch (Subtable->Type)
923 {
924 case ACPI_FPDT_TYPE_BOOT:
925
926 InfoTable = AcpiDmTableInfoFpdt0;
927 break;
928
929 case ACPI_FPDT_TYPE_S3PERF:
930
931 InfoTable = AcpiDmTableInfoFpdt1;
932 break;
933
934 default:
935
936 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
937 Subtable->Type);
938
939 /* Attempt to continue */
940
941 if (!Subtable->Length)
942 {
943 AcpiOsPrintf ("Invalid zero length subtable\n");
944 return;
945 }
946 goto NextSubtable;
947 }
948
949 Status = AcpiDmDumpTable (Length, Offset, Subtable,
950 Subtable->Length, InfoTable);
951 if (ACPI_FAILURE (Status))
952 {
953 return;
954 }
955
956 NextSubtable:
957 /* Point to next subtable */
958
959 Offset += Subtable->Length;
960 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
961 Subtable->Length);
962 }
963 }
964
965
966 /*******************************************************************************
967 *
968 * FUNCTION: AcpiDmDumpGtdt
969 *
970 * PARAMETERS: Table - A GTDT table
971 *
972 * RETURN: None
973 *
974 * DESCRIPTION: Format the contents of a GTDT. This table type consists
975 * of an open-ended number of subtables.
976 *
977 ******************************************************************************/
978
979 void
980 AcpiDmDumpGtdt (
981 ACPI_TABLE_HEADER *Table)
982 {
983 ACPI_STATUS Status;
984 ACPI_GTDT_HEADER *Subtable;
985 UINT32 Length = Table->Length;
986 UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
987 ACPI_DMTABLE_INFO *InfoTable;
988 UINT32 SubtableLength;
989 UINT32 GtCount;
990 ACPI_GTDT_TIMER_ENTRY *GtxTable;
991
992
993 /* Main table */
994
995 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
996 if (ACPI_FAILURE (Status))
997 {
998 return;
999 }
1000
1001 /* Subtables */
1002
1003 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1004 while (Offset < Table->Length)
1005 {
1006 /* Common subtable header */
1007
1008 AcpiOsPrintf ("\n");
1009 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1010 Subtable->Length, AcpiDmTableInfoGtdtHdr);
1011 if (ACPI_FAILURE (Status))
1012 {
1013 return;
1014 }
1015
1016 GtCount = 0;
1017 switch (Subtable->Type)
1018 {
1019 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1020
1021 SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1022 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1023 Subtable))->TimerCount;
1024
1025 InfoTable = AcpiDmTableInfoGtdt0;
1026 break;
1027
1028 case ACPI_GTDT_TYPE_WATCHDOG:
1029
1030 SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
1031
1032 InfoTable = AcpiDmTableInfoGtdt1;
1033 break;
1034
1035 default:
1036
1037 /* Cannot continue on unknown type - no length */
1038
1039 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1040 Subtable->Type);
1041 return;
1042 }
1043
1044 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1045 Subtable->Length, InfoTable);
1046 if (ACPI_FAILURE (Status))
1047 {
1048 return;
1049 }
1050
1051 /* Point to end of current subtable (each subtable above is of fixed length) */
1052
1053 Offset += SubtableLength;
1054
1055 /* If there are any Gt Timer Blocks from above, dump them now */
1056
1057 if (GtCount)
1058 {
1059 GtxTable = ACPI_ADD_PTR (
1060 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
1061 SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1062
1063 while (GtCount)
1064 {
1065 AcpiOsPrintf ("\n");
1066 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1067 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1068 if (ACPI_FAILURE (Status))
1069 {
1070 return;
1071 }
1072 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1073 GtxTable++;
1074 GtCount--;
1075 }
1076 }
1077
1078 /* Point to next subtable */
1079
1080 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
1081 }
1082 }
1083
1084
1085 /*******************************************************************************
1086 *
1087 * FUNCTION: AcpiDmDumpHest
1088 *
1089 * PARAMETERS: Table - A HEST table
1090 *
1091 * RETURN: None
1092 *
1093 * DESCRIPTION: Format the contents of a HEST. This table type consists
1094 * of an open-ended number of subtables.
1095 *
1096 ******************************************************************************/
1097
1098 void
1099 AcpiDmDumpHest (
1100 ACPI_TABLE_HEADER *Table)
1101 {
1102 ACPI_STATUS Status;
1103 ACPI_HEST_HEADER *Subtable;
1104 UINT32 Length = Table->Length;
1105 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1106 ACPI_DMTABLE_INFO *InfoTable;
1107 UINT32 SubtableLength;
1108 UINT32 BankCount;
1109 ACPI_HEST_IA_ERROR_BANK *BankTable;
1110
1111
1112 /* Main table */
1113
1114 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1115 if (ACPI_FAILURE (Status))
1116 {
1117 return;
1118 }
1119
1120 /* Subtables */
1121
1122 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1123 while (Offset < Table->Length)
1124 {
1125 BankCount = 0;
1126 switch (Subtable->Type)
1127 {
1128 case ACPI_HEST_TYPE_IA32_CHECK:
1129
1130 InfoTable = AcpiDmTableInfoHest0;
1131 SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1132 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1133 Subtable))->NumHardwareBanks;
1134 break;
1135
1136 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1137
1138 InfoTable = AcpiDmTableInfoHest1;
1139 SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1140 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1141 Subtable))->NumHardwareBanks;
1142 break;
1143
1144 case ACPI_HEST_TYPE_IA32_NMI:
1145
1146 InfoTable = AcpiDmTableInfoHest2;
1147 SubtableLength = sizeof (ACPI_HEST_IA_NMI);
1148 break;
1149
1150 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1151
1152 InfoTable = AcpiDmTableInfoHest6;
1153 SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
1154 break;
1155
1156 case ACPI_HEST_TYPE_AER_ENDPOINT:
1157
1158 InfoTable = AcpiDmTableInfoHest7;
1159 SubtableLength = sizeof (ACPI_HEST_AER);
1160 break;
1161
1162 case ACPI_HEST_TYPE_AER_BRIDGE:
1163
1164 InfoTable = AcpiDmTableInfoHest8;
1165 SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1166 break;
1167
1168 case ACPI_HEST_TYPE_GENERIC_ERROR:
1169
1170 InfoTable = AcpiDmTableInfoHest9;
1171 SubtableLength = sizeof (ACPI_HEST_GENERIC);
1172 break;
1173
1174 case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1175
1176 InfoTable = AcpiDmTableInfoHest10;
1177 SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
1178 break;
1179
1180 case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
1181
1182 InfoTable = AcpiDmTableInfoHest11;
1183 SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
1184 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
1185 Subtable))->NumHardwareBanks;
1186 break;
1187
1188 default:
1189
1190 /* Cannot continue on unknown type - no length */
1191
1192 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1193 Subtable->Type);
1194 return;
1195 }
1196
1197 AcpiOsPrintf ("\n");
1198 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1199 SubtableLength, InfoTable);
1200 if (ACPI_FAILURE (Status))
1201 {
1202 return;
1203 }
1204
1205 /* Point to end of current subtable (each subtable above is of fixed length) */
1206
1207 Offset += SubtableLength;
1208
1209 /* If there are any (fixed-length) Error Banks from above, dump them now */
1210
1211 if (BankCount)
1212 {
1213 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
1214 SubtableLength);
1215 SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1216
1217 while (BankCount)
1218 {
1219 AcpiOsPrintf ("\n");
1220 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1221 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1222 if (ACPI_FAILURE (Status))
1223 {
1224 return;
1225 }
1226
1227 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1228 BankTable++;
1229 BankCount--;
1230 }
1231 }
1232
1233 /* Point to next subtable */
1234
1235 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
1236 }
1237 }
1238
1239
1240 /*******************************************************************************
1241 *
1242 * FUNCTION: AcpiDmDumpHmat
1243 *
1244 * PARAMETERS: Table - A HMAT table
1245 *
1246 * RETURN: None
1247 *
1248 * DESCRIPTION: Format the contents of a HMAT.
1249 *
1250 ******************************************************************************/
1251
1252 void
1253 AcpiDmDumpHmat (
1254 ACPI_TABLE_HEADER *Table)
1255 {
1256 ACPI_STATUS Status;
1257 ACPI_HMAT_STRUCTURE *HmatStruct;
1258 ACPI_HMAT_LOCALITY *HmatLocality;
1259 ACPI_HMAT_CACHE *HmatCache;
1260 UINT32 Offset;
1261 UINT32 SubtableOffset;
1262 UINT32 Length;
1263 ACPI_DMTABLE_INFO *InfoTable;
1264 UINT32 i, j;
1265
1266
1267 /* Main table */
1268
1269 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
1270 if (ACPI_FAILURE (Status))
1271 {
1272 return;
1273 }
1274 Offset = sizeof (ACPI_TABLE_HMAT);
1275
1276 while (Offset < Table->Length)
1277 {
1278 AcpiOsPrintf ("\n");
1279 SubtableOffset = 0;
1280
1281 /* Dump HMAT structure header */
1282
1283 HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
1284 if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
1285 {
1286 AcpiOsPrintf ("Invalid HMAT structure length\n");
1287 return;
1288 }
1289 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1290 HmatStruct->Length, AcpiDmTableInfoHmatHdr);
1291 if (ACPI_FAILURE (Status))
1292 {
1293 return;
1294 }
1295
1296 switch (HmatStruct->Type)
1297 {
1298 case ACPI_HMAT_TYPE_ADDRESS_RANGE:
1299
1300 InfoTable = AcpiDmTableInfoHmat0;
1301 Length = sizeof (ACPI_HMAT_ADDRESS_RANGE);
1302 break;
1303
1304 case ACPI_HMAT_TYPE_LOCALITY:
1305
1306 InfoTable = AcpiDmTableInfoHmat1;
1307 Length = sizeof (ACPI_HMAT_LOCALITY);
1308 break;
1309
1310 case ACPI_HMAT_TYPE_CACHE:
1311
1312 InfoTable = AcpiDmTableInfoHmat2;
1313 Length = sizeof (ACPI_HMAT_CACHE);
1314 break;
1315
1316 default:
1317
1318 AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
1319 HmatStruct->Type);
1320
1321 /* Attempt to continue */
1322
1323 goto NextSubtable;
1324 }
1325
1326 /* Dump HMAT structure body */
1327
1328 if (HmatStruct->Length < Length)
1329 {
1330 AcpiOsPrintf ("Invalid HMAT structure length\n");
1331 return;
1332 }
1333 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1334 HmatStruct->Length, InfoTable);
1335 if (ACPI_FAILURE (Status))
1336 {
1337 return;
1338 }
1339
1340 /* Dump HMAT structure additionals */
1341
1342 switch (HmatStruct->Type)
1343 {
1344 case ACPI_HMAT_TYPE_LOCALITY:
1345
1346 HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
1347 SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
1348
1349 /* Dump initiator proximity domains */
1350
1351 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1352 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
1353 {
1354 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
1355 return;
1356 }
1357 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1358 {
1359 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1360 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1361 4, AcpiDmTableInfoHmat1a);
1362 SubtableOffset += 4;
1363 }
1364
1365 /* Dump target proximity domains */
1366
1367 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1368 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
1369 {
1370 AcpiOsPrintf ("Invalid target proximity domain number\n");
1371 return;
1372 }
1373 for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
1374 {
1375 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1376 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1377 4, AcpiDmTableInfoHmat1b);
1378 SubtableOffset += 4;
1379 }
1380
1381 /* Dump latency/bandwidth entris */
1382
1383 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1384 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
1385 HmatLocality->NumberOfTargetPDs * 2))
1386 {
1387 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
1388 return;
1389 }
1390 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
1391 {
1392 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
1393 {
1394 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1395 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1396 2, AcpiDmTableInfoHmat1c);
1397 SubtableOffset += 2;
1398 }
1399 }
1400 break;
1401
1402 case ACPI_HMAT_TYPE_CACHE:
1403
1404 HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
1405 SubtableOffset = sizeof (ACPI_HMAT_CACHE);
1406
1407 /* Dump SMBIOS handles */
1408
1409 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
1410 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
1411 {
1412 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
1413 return;
1414 }
1415 for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
1416 {
1417 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
1418 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
1419 2, AcpiDmTableInfoHmat2a);
1420 SubtableOffset += 2;
1421 }
1422 break;
1423
1424 default:
1425
1426 break;
1427 }
1428
1429 NextSubtable:
1430 /* Point to next HMAT structure subtable */
1431
1432 Offset += (HmatStruct->Length);
1433 }
1434 }
1435