dmtbdump1.c revision 1.1.1.10 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump1 - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2023, 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 MERCHANTABILITY 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 #include "aslcompiler.h"
49
50 /* This module used for application-level code only */
51
52 #define _COMPONENT ACPI_CA_DISASSEMBLER
53 ACPI_MODULE_NAME ("dmtbdump1")
54
55
56 /*******************************************************************************
57 *
58 * FUNCTION: AcpiDmDumpAest
59 *
60 * PARAMETERS: Table - A AEST table
61 *
62 * RETURN: None
63 *
64 * DESCRIPTION: Format the contents of a AEST table
65 *
66 * NOTE: Assumes the following table structure:
67 * For all AEST Error Nodes:
68 * 1) An AEST Error Node, followed immediately by:
69 * 2) Any node-specific data
70 * 3) An Interface Structure (one)
71 * 4) A list (array) of Interrupt Structures
72 *
73 * AEST - ARM Error Source table. Conforms to:
74 * ACPI for the Armv8 RAS Extensions 1.1 Platform Design Document Sep 2020
75 *
76 ******************************************************************************/
77
78 void
79 AcpiDmDumpAest (
80 ACPI_TABLE_HEADER *Table)
81 {
82 ACPI_STATUS Status;
83 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
84 ACPI_AEST_HEADER *Subtable;
85 ACPI_AEST_HEADER *NodeHeader;
86 ACPI_AEST_PROCESSOR *ProcessorSubtable;
87 ACPI_DMTABLE_INFO *InfoTable;
88 ACPI_SIZE Length;
89 UINT8 Type;
90
91
92 /* Very small, generic main table. AEST consists of mostly subtables */
93
94 while (Offset < Table->Length)
95 {
96 NodeHeader = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
97
98 /* Dump the common error node (subtable) header */
99
100 Status = AcpiDmDumpTable (Table->Length, Offset, NodeHeader,
101 NodeHeader->Length, AcpiDmTableInfoAestHdr);
102 if (ACPI_FAILURE (Status))
103 {
104 return;
105 }
106
107 Type = NodeHeader->Type;
108
109 /* Setup the node-specific subtable based on the header Type field */
110
111 switch (Type)
112 {
113 case ACPI_AEST_PROCESSOR_ERROR_NODE:
114 InfoTable = AcpiDmTableInfoAestProcError;
115 Length = sizeof (ACPI_AEST_PROCESSOR);
116 break;
117
118 case ACPI_AEST_MEMORY_ERROR_NODE:
119 InfoTable = AcpiDmTableInfoAestMemError;
120 Length = sizeof (ACPI_AEST_MEMORY);
121 break;
122
123 case ACPI_AEST_SMMU_ERROR_NODE:
124 InfoTable = AcpiDmTableInfoAestSmmuError;
125 Length = sizeof (ACPI_AEST_SMMU);
126 break;
127
128 case ACPI_AEST_VENDOR_ERROR_NODE:
129 InfoTable = AcpiDmTableInfoAestVendorError;
130 Length = sizeof (ACPI_AEST_VENDOR);
131 break;
132
133 case ACPI_AEST_GIC_ERROR_NODE:
134 InfoTable = AcpiDmTableInfoAestGicError;
135 Length = sizeof (ACPI_AEST_GIC);
136 break;
137
138 /* Error case below */
139 default:
140
141 AcpiOsPrintf ("\n**** Unknown AEST Error Subtable type 0x%X\n",
142 Type);
143 return;
144 }
145
146 /* Point past the common header (to the node-specific data) */
147
148 Offset += sizeof (ACPI_AEST_HEADER);
149 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
150 AcpiOsPrintf ("\n");
151
152 /* Dump the node-specific subtable */
153
154 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Length,
155 InfoTable);
156 if (ACPI_FAILURE (Status))
157 {
158 return;
159 }
160 AcpiOsPrintf ("\n");
161
162 if (Type == ACPI_AEST_PROCESSOR_ERROR_NODE)
163 {
164 /*
165 * Special handling for PROCESSOR_ERROR_NODE subtables
166 * (to handle the Resource Substructure via the ResourceType
167 * field).
168 */
169
170 /* Point past the node-specific data */
171
172 Offset += Length;
173 ProcessorSubtable = ACPI_CAST_PTR (ACPI_AEST_PROCESSOR, Subtable);
174
175 switch (ProcessorSubtable->ResourceType)
176 {
177 /* Setup the Resource Substructure subtable */
178
179 case ACPI_AEST_CACHE_RESOURCE:
180 InfoTable = AcpiDmTableInfoAestCacheRsrc;
181 Length = sizeof (ACPI_AEST_PROCESSOR_CACHE);
182 break;
183
184 case ACPI_AEST_TLB_RESOURCE:
185 InfoTable = AcpiDmTableInfoAestTlbRsrc;
186 Length = sizeof (ACPI_AEST_PROCESSOR_TLB);
187 break;
188
189 case ACPI_AEST_GENERIC_RESOURCE:
190 InfoTable = AcpiDmTableInfoAestGenRsrc;
191 Length = sizeof (ACPI_AEST_PROCESSOR_GENERIC);
192 break;
193
194 /* Error case below */
195 default:
196 AcpiOsPrintf ("\n**** Unknown AEST Processor Resource type 0x%X\n",
197 ProcessorSubtable->ResourceType);
198 return;
199 }
200
201 ProcessorSubtable = ACPI_ADD_PTR (ACPI_AEST_PROCESSOR, Table,
202 Offset);
203
204 /* Dump the resource substructure subtable */
205
206 Status = AcpiDmDumpTable (Table->Length, Offset, ProcessorSubtable,
207 Length, InfoTable);
208 if (ACPI_FAILURE (Status))
209 {
210 return;
211 }
212
213 AcpiOsPrintf ("\n");
214 }
215
216 /* Point past the resource substructure or the node-specific data */
217
218 Offset += Length;
219
220 /* Dump the interface structure, required to be present */
221
222 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
223 if (Subtable->Type >= ACPI_AEST_XFACE_RESERVED)
224 {
225 AcpiOsPrintf ("\n**** Unknown AEST Node Interface type 0x%X\n",
226 Subtable->Type);
227 return;
228 }
229
230 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
231 sizeof (ACPI_AEST_NODE_INTERFACE), AcpiDmTableInfoAestXface);
232 if (ACPI_FAILURE (Status))
233 {
234 return;
235 }
236
237 /* Point past the interface structure */
238
239 AcpiOsPrintf ("\n");
240 Offset += sizeof (ACPI_AEST_NODE_INTERFACE);
241
242 /* Dump the entire interrupt structure array, if present */
243
244 if (NodeHeader->NodeInterruptOffset)
245 {
246 Length = NodeHeader->NodeInterruptCount;
247 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
248
249 while (Length)
250 {
251 /* Dump the interrupt structure */
252
253 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
254 sizeof (ACPI_AEST_NODE_INTERRUPT),
255 AcpiDmTableInfoAestXrupt);
256 if (ACPI_FAILURE (Status))
257 {
258 return;
259 }
260
261 /* Point to the next interrupt structure */
262
263 Offset += sizeof (ACPI_AEST_NODE_INTERRUPT);
264 Subtable = ACPI_ADD_PTR (ACPI_AEST_HEADER, Table, Offset);
265 Length--;
266 AcpiOsPrintf ("\n");
267 }
268 }
269 }
270 }
271
272 /*******************************************************************************
273 *
274 * FUNCTION: AcpiDmDumpApmt
275 *
276 * PARAMETERS: Table - A APMT table
277 *
278 * RETURN: None
279 *
280 * DESCRIPTION: Format the contents of a APMT. This table type consists
281 * of an open-ended number of subtables.
282 *
283 *
284 * APMT - ARM Performance Monitoring Unit table. Conforms to:
285 * ARM Performance Monitoring Unit Architecture 1.0 Platform Design Document
286 * ARM DEN0117 v1.0 November 25, 2021
287 *
288 ******************************************************************************/
289
290 void
291 AcpiDmDumpApmt (
292 ACPI_TABLE_HEADER *Table)
293 {
294 ACPI_STATUS Status;
295 ACPI_APMT_NODE *Subtable;
296 UINT32 Length = Table->Length;
297 UINT32 Offset = sizeof (ACPI_TABLE_APMT);
298 UINT32 NodeNum = 0;
299
300 /* There is no main table (other than the standard ACPI header) */
301
302 /* Subtables */
303
304 Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Table, Offset);
305 while (Offset < Table->Length)
306 {
307 AcpiOsPrintf ("\n");
308
309 if (Subtable->Type >= ACPI_APMT_NODE_TYPE_COUNT)
310 {
311 AcpiOsPrintf ("\n**** Unknown APMT subtable type 0x%X\n",
312 Subtable->Type);
313 return;
314 }
315
316 AcpiOsPrintf ("/* APMT Node-%u */\n", NodeNum++);
317
318 Status = AcpiDmDumpTable (Length, Offset, Subtable,
319 Subtable->Length, AcpiDmTableInfoApmtNode);
320 if (ACPI_FAILURE (Status))
321 {
322 return;
323 }
324
325 /* Point to next subtable */
326
327 Offset += Subtable->Length;
328 Subtable = ACPI_ADD_PTR (ACPI_APMT_NODE, Subtable,
329 Subtable->Length);
330 AcpiOsPrintf ("\n");
331 }
332 }
333
334
335 /*******************************************************************************
336 *
337 * FUNCTION: AcpiDmDumpAsf
338 *
339 * PARAMETERS: Table - A ASF table
340 *
341 * RETURN: None
342 *
343 * DESCRIPTION: Format the contents of a ASF table
344 *
345 ******************************************************************************/
346
347 void
348 AcpiDmDumpAsf (
349 ACPI_TABLE_HEADER *Table)
350 {
351 ACPI_STATUS Status;
352 UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
353 ACPI_ASF_INFO *Subtable;
354 ACPI_DMTABLE_INFO *InfoTable;
355 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
356 UINT8 *DataTable = NULL;
357 UINT32 DataCount = 0;
358 UINT32 DataLength = 0;
359 UINT32 DataOffset = 0;
360 UINT32 i;
361 UINT8 Type;
362
363
364 /* No main table, only subtables */
365
366 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
367 while (Offset < Table->Length)
368 {
369 /* Common subtable header */
370
371 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
372 Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
373 if (ACPI_FAILURE (Status))
374 {
375 return;
376 }
377
378 /* The actual type is the lower 7 bits of Type */
379
380 Type = (UINT8) (Subtable->Header.Type & 0x7F);
381
382 switch (Type)
383 {
384 case ACPI_ASF_TYPE_INFO:
385
386 InfoTable = AcpiDmTableInfoAsf0;
387 break;
388
389 case ACPI_ASF_TYPE_ALERT:
390
391 InfoTable = AcpiDmTableInfoAsf1;
392 DataInfoTable = AcpiDmTableInfoAsf1a;
393 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT));
394 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts;
395 DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength;
396 DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
397 break;
398
399 case ACPI_ASF_TYPE_CONTROL:
400
401 InfoTable = AcpiDmTableInfoAsf2;
402 DataInfoTable = AcpiDmTableInfoAsf2a;
403 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE));
404 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls;
405 DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength;
406 DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
407 break;
408
409 case ACPI_ASF_TYPE_BOOT:
410
411 InfoTable = AcpiDmTableInfoAsf3;
412 break;
413
414 case ACPI_ASF_TYPE_ADDRESS:
415
416 InfoTable = AcpiDmTableInfoAsf4;
417 DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS));
418 DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices;
419 DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
420 break;
421
422 default:
423
424 AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n",
425 Subtable->Header.Type);
426 return;
427 }
428
429 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
430 Subtable->Header.Length, InfoTable);
431 if (ACPI_FAILURE (Status))
432 {
433 return;
434 }
435
436 /* Dump variable-length extra data */
437
438 switch (Type)
439 {
440 case ACPI_ASF_TYPE_ALERT:
441 case ACPI_ASF_TYPE_CONTROL:
442
443 for (i = 0; i < DataCount; i++)
444 {
445 AcpiOsPrintf ("\n");
446 Status = AcpiDmDumpTable (Table->Length, DataOffset,
447 DataTable, DataLength, DataInfoTable);
448 if (ACPI_FAILURE (Status))
449 {
450 return;
451 }
452
453 DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
454 DataOffset += DataLength;
455 }
456 break;
457
458 case ACPI_ASF_TYPE_ADDRESS:
459
460 for (i = 0; i < DataLength; i++)
461 {
462 if (!(i % 16))
463 {
464 AcpiDmLineHeader (DataOffset, 1, "Addresses");
465 }
466
467 AcpiOsPrintf ("%2.2X ", *DataTable);
468 DataTable++;
469 DataOffset++;
470
471 if (DataOffset > Table->Length)
472 {
473 AcpiOsPrintf (
474 "**** ACPI table terminates in the middle of a "
475 "data structure! (ASF! table)\n");
476 return;
477 }
478 }
479
480 AcpiOsPrintf ("\n");
481 break;
482
483 default:
484
485 break;
486 }
487
488 AcpiOsPrintf ("\n");
489
490 /* Point to next subtable */
491
492 if (!Subtable->Header.Length)
493 {
494 AcpiOsPrintf ("Invalid zero subtable header length\n");
495 return;
496 }
497
498 Offset += Subtable->Header.Length;
499 Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
500 Subtable->Header.Length);
501 }
502 }
503
504 /*******************************************************************************
505 *
506 * FUNCTION: AcpiDmDumpAspt
507 *
508 * PARAMETERS: Table - A ASPT table
509 *
510 * RETURN: None
511 *
512 * DESCRIPTION: Format the contents of a ASPT table
513 *
514 ******************************************************************************/
515
516 void
517 AcpiDmDumpAspt (
518 ACPI_TABLE_HEADER *Table)
519 {
520 ACPI_STATUS Status;
521 UINT32 Offset = sizeof (ACPI_TABLE_ASPT);
522 UINT32 Length = Table->Length;
523 ACPI_ASPT_HEADER *Subtable;
524 ACPI_DMTABLE_INFO *InfoTable;
525 UINT16 Type;
526
527 /* Main table */
528 Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt);
529
530 /* Subtables */
531
532 Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset);
533 while (Offset < Table->Length)
534 {
535 AcpiOsPrintf ("\n");
536
537 /* Common subtable header */
538 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
539 Subtable->Length, AcpiDmTableInfoAsptHdr);
540 if (ACPI_FAILURE (Status))
541 {
542 return;
543 }
544
545 Type = Subtable->Type;
546
547 switch (Type)
548 {
549 case ACPI_ASPT_TYPE_GLOBAL_REGS:
550
551 InfoTable = AcpiDmTableInfoAspt0;
552 break;
553
554 case ACPI_ASPT_TYPE_SEV_MBOX_REGS:
555
556 InfoTable = AcpiDmTableInfoAspt1;
557 break;
558
559 case ACPI_ASPT_TYPE_ACPI_MBOX_REGS:
560
561 InfoTable = AcpiDmTableInfoAspt2;
562 break;
563
564 default:
565
566 AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n",
567 Subtable->Type);
568 return;
569 }
570
571 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
572 Subtable->Length, InfoTable);
573 if (ACPI_FAILURE (Status))
574 {
575 return;
576 }
577
578 AcpiOsPrintf ("\n");
579
580 /* Point to next subtable */
581 if (!Subtable->Length)
582 {
583 AcpiOsPrintf ("Invalid zero subtable header length\n");
584 return;
585 }
586
587 Offset += Subtable->Length;
588 Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable,
589 Subtable->Length);
590 }
591 }
592
593
594 /*******************************************************************************
595 *
596 * FUNCTION: AcpiDmDumpCdat
597 *
598 * PARAMETERS: InTable - A CDAT table
599 *
600 * RETURN: None
601 *
602 * DESCRIPTION: Format the contents of a CDAT. This table type consists
603 * of an open-ended number of subtables.
604 *
605 ******************************************************************************/
606
607 void
608 AcpiDmDumpCdat (
609 ACPI_TABLE_HEADER *InTable)
610 {
611 ACPI_TABLE_CDAT *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable);
612 ACPI_STATUS Status;
613 ACPI_CDAT_HEADER *Subtable;
614 ACPI_TABLE_CDAT *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table);
615 ACPI_DMTABLE_INFO *InfoTable;
616 UINT32 Length = CdatTable->Length;
617 UINT32 Offset = sizeof (ACPI_TABLE_CDAT);
618 UINT32 SubtableLength;
619 UINT32 SubtableType;
620 INT32 EntriesLength;
621
622
623 /* Main table */
624
625 Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0,
626 AcpiDmTableInfoCdatTableHdr);
627 if (ACPI_FAILURE (Status))
628 {
629 return;
630 }
631
632 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT));
633 while (Offset < Table->Length)
634 {
635 /* Dump the common subtable header */
636
637 DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset);
638 AcpiOsPrintf ("\n");
639 Status = AcpiDmDumpTable (Length, Offset, Subtable,
640 sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader);
641 if (ACPI_FAILURE (Status))
642 {
643 return;
644 }
645
646 /* Point past the common subtable header, decode the subtable type */
647
648 Offset += sizeof (ACPI_CDAT_HEADER);
649 SubtableType = Subtable->Type;
650
651 switch (Subtable->Type)
652 {
653 case ACPI_CDAT_TYPE_DSMAS:
654 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
655 SubtableLength = sizeof (ACPI_CDAT_DSMAS);
656
657 InfoTable = AcpiDmTableInfoCdat0;
658 break;
659
660 case ACPI_CDAT_TYPE_DSLBIS:
661 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
662 SubtableLength = sizeof (ACPI_CDAT_DSLBIS);
663 DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset);
664
665 InfoTable = AcpiDmTableInfoCdat1;
666 break;
667
668 case ACPI_CDAT_TYPE_DSMSCIS:
669 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
670 SubtableLength = sizeof (ACPI_CDAT_DSMSCIS);
671
672 InfoTable = AcpiDmTableInfoCdat2;
673 break;
674
675 case ACPI_CDAT_TYPE_DSIS:
676 DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset);
677 SubtableLength = sizeof (ACPI_CDAT_DSIS);
678 DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table);
679 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
680 DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n",
681 Table, Subtable, Offset);
682 DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset);
683
684 InfoTable = AcpiDmTableInfoCdat3;
685 break;
686
687 case ACPI_CDAT_TYPE_DSEMTS:
688 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
689 SubtableLength = sizeof (ACPI_CDAT_DSEMTS);
690
691 InfoTable = AcpiDmTableInfoCdat4;
692 break;
693
694 case ACPI_CDAT_TYPE_SSLBIS:
695 SubtableLength = Subtable->Length;
696
697 InfoTable = AcpiDmTableInfoCdat5;
698 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
699 break;
700
701 default:
702 fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type);
703 return;
704 }
705
706 DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual "
707 "Length: %X Offset: %X tableptr: %p\n", SubtableType,
708 Subtable->Length, SubtableLength, Offset, Table);
709
710 /*
711 * Do the subtable-specific fields
712 */
713 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable);
714 if (ACPI_FAILURE (Status))
715 {
716 return;
717 }
718
719 DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n",
720 SubtableType, Offset, SubtableLength);
721
722 /* Additional sub-subtables, dependent on the main subtable type */
723
724 switch (SubtableType)
725 {
726 case ACPI_CDAT_TYPE_SSLBIS:
727 Offset += sizeof (ACPI_CDAT_SSLBIS);
728 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table,
729 Offset);
730
731 DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X "
732 "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length);
733
734 /* Generate the total length of all the SSLBE entries */
735
736 EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) -
737 sizeof (ACPI_CDAT_SSLBIS);
738 DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n",
739 EntriesLength, Offset, Table->Length);
740
741 /* Do each of the SSLBE Entries */
742
743 while ((EntriesLength > 0) && (Offset < Table->Length))
744 {
745 AcpiOsPrintf ("\n");
746
747 Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset,
748 AcpiDmTableInfoCdatEntries);
749 if (ACPI_FAILURE (Status))
750 {
751 return;
752 }
753
754 EntriesLength -= sizeof (ACPI_CDAT_SSLBE);
755 Offset += sizeof (ACPI_CDAT_SSLBE);
756 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
757 }
758
759 SubtableLength = 0;
760 break;
761
762 default:
763 break;
764 }
765
766 DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n",
767 Offset, SubtableLength);
768
769 /* Point to next subtable */
770
771 Offset += SubtableLength;
772 Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset);
773 }
774
775 return;
776 }
777
778
779 /*******************************************************************************
780 *
781 * FUNCTION: AcpiDmDumpCedt
782 *
783 * PARAMETERS: Table - A CEDT table
784 *
785 * RETURN: None
786 *
787 * DESCRIPTION: Format the contents of a CEDT. This table type consists
788 * of an open-ended number of subtables.
789 *
790 ******************************************************************************/
791
792 void
793 AcpiDmDumpCedt (
794 ACPI_TABLE_HEADER *Table)
795 {
796 ACPI_STATUS Status;
797 ACPI_CEDT_HEADER *Subtable;
798 UINT32 Length = Table->Length;
799 UINT32 Offset = sizeof (ACPI_TABLE_CEDT);
800
801
802 /* There is no main table (other than the standard ACPI header) */
803
804 Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Table, Offset);
805 while (Offset < Table->Length)
806 {
807 /* Common subtable header */
808
809 AcpiOsPrintf ("\n");
810 Status = AcpiDmDumpTable (Length, Offset, Subtable,
811 Subtable->Length, AcpiDmTableInfoCedtHdr);
812 if (ACPI_FAILURE (Status))
813 {
814 return;
815 }
816
817 switch (Subtable->Type)
818 {
819 case ACPI_CEDT_TYPE_CHBS:
820 Status = AcpiDmDumpTable (Length, Offset, Subtable,
821 Subtable->Length, AcpiDmTableInfoCedt0);
822 if (ACPI_FAILURE (Status))
823 {
824 return;
825 }
826 break;
827
828 case ACPI_CEDT_TYPE_CFMWS:
829 {
830 ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable;
831 unsigned int i, max = 0x01 << (ptr->InterleaveWays);
832
833 /* print out table with first "Interleave target" */
834
835 Status = AcpiDmDumpTable (Length, Offset, Subtable,
836 Subtable->Length, AcpiDmTableInfoCedt1);
837 if (ACPI_FAILURE (Status))
838 {
839 return;
840 }
841
842 /* Now, print out any interleave targets beyond the first. */
843
844 for (i = 1; i < max; i++)
845 {
846 unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets);
847 unsigned int *trg = &(ptr->InterleaveTargets[i]);
848
849 Status = AcpiDmDumpTable (Length, loc_offset, trg,
850 Subtable->Length, AcpiDmTableInfoCedt1_te);
851 if (ACPI_FAILURE (Status))
852 {
853 return;
854 }
855 }
856 break;
857 }
858
859 default:
860 AcpiOsPrintf ("\n**** Unknown CEDT subtable type 0x%X\n\n",
861 Subtable->Type);
862
863 /* Attempt to continue */
864 if (!Subtable->Length)
865 {
866 AcpiOsPrintf ("Invalid zero length subtable\n");
867 return;
868 }
869 }
870
871 /* Point to next subtable */
872 Offset += Subtable->Length;
873 Subtable = ACPI_ADD_PTR (ACPI_CEDT_HEADER, Subtable,
874 Subtable->Length);
875 }
876 }
877
878 /*******************************************************************************
879 *
880 * FUNCTION: AcpiDmDumpCpep
881 *
882 * PARAMETERS: Table - A CPEP table
883 *
884 * RETURN: None
885 *
886 * DESCRIPTION: Format the contents of a CPEP. This table type consists
887 * of an open-ended number of subtables.
888 *
889 ******************************************************************************/
890
891 void
892 AcpiDmDumpCpep (
893 ACPI_TABLE_HEADER *Table)
894 {
895 ACPI_STATUS Status;
896 ACPI_CPEP_POLLING *Subtable;
897 UINT32 Length = Table->Length;
898 UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
899
900
901 /* Main table */
902
903 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
904 if (ACPI_FAILURE (Status))
905 {
906 return;
907 }
908
909 /* Subtables */
910
911 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
912 while (Offset < Table->Length)
913 {
914 AcpiOsPrintf ("\n");
915 Status = AcpiDmDumpTable (Length, Offset, Subtable,
916 Subtable->Header.Length, AcpiDmTableInfoCpep0);
917 if (ACPI_FAILURE (Status))
918 {
919 return;
920 }
921
922 /* Point to next subtable */
923
924 Offset += Subtable->Header.Length;
925 Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable,
926 Subtable->Header.Length);
927 }
928 }
929
930
931 /*******************************************************************************
932 *
933 * FUNCTION: AcpiDmDumpCsrt
934 *
935 * PARAMETERS: Table - A CSRT table
936 *
937 * RETURN: None
938 *
939 * DESCRIPTION: Format the contents of a CSRT. This table type consists
940 * of an open-ended number of subtables.
941 *
942 ******************************************************************************/
943
944 void
945 AcpiDmDumpCsrt (
946 ACPI_TABLE_HEADER *Table)
947 {
948 ACPI_STATUS Status;
949 ACPI_CSRT_GROUP *Subtable;
950 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
951 ACPI_CSRT_DESCRIPTOR *SubSubtable;
952 UINT32 Length = Table->Length;
953 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
954 UINT32 SubOffset;
955 UINT32 SubSubOffset;
956 UINT32 InfoLength;
957
958
959 /* The main table only contains the ACPI header, thus already handled */
960
961 /* Subtables (Resource Groups) */
962
963 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
964 while (Offset < Table->Length)
965 {
966 /* Resource group subtable */
967
968 AcpiOsPrintf ("\n");
969 Status = AcpiDmDumpTable (Length, Offset, Subtable,
970 Subtable->Length, AcpiDmTableInfoCsrt0);
971 if (ACPI_FAILURE (Status))
972 {
973 return;
974 }
975
976 /* Shared info subtable (One per resource group) */
977
978 SubOffset = sizeof (ACPI_CSRT_GROUP);
979 SharedInfoTable = ACPI_ADD_PTR (ACPI_CSRT_SHARED_INFO, Table,
980 Offset + SubOffset);
981
982 AcpiOsPrintf ("\n");
983 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
984 sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
985 if (ACPI_FAILURE (Status))
986 {
987 return;
988 }
989
990 SubOffset += Subtable->SharedInfoLength;
991
992 /* Sub-Subtables (Resource Descriptors) */
993
994 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
995 Offset + SubOffset);
996
997 while ((SubOffset < Subtable->Length) &&
998 ((Offset + SubOffset) < Table->Length))
999 {
1000 AcpiOsPrintf ("\n");
1001 Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
1002 SubSubtable->Length, AcpiDmTableInfoCsrt2);
1003 if (ACPI_FAILURE (Status))
1004 {
1005 return;
1006 }
1007
1008 SubSubOffset = sizeof (ACPI_CSRT_DESCRIPTOR);
1009
1010 /* Resource-specific info buffer */
1011
1012 InfoLength = SubSubtable->Length - SubSubOffset;
1013 if (InfoLength)
1014 {
1015 Status = AcpiDmDumpTable (Length,
1016 Offset + SubOffset + SubSubOffset, Table,
1017 InfoLength, AcpiDmTableInfoCsrt2a);
1018 if (ACPI_FAILURE (Status))
1019 {
1020 return;
1021 }
1022 }
1023
1024 /* Point to next sub-subtable */
1025
1026 SubOffset += SubSubtable->Length;
1027 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
1028 SubSubtable->Length);
1029 }
1030
1031 /* Point to next subtable */
1032
1033 Offset += Subtable->Length;
1034 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
1035 Subtable->Length);
1036 }
1037 }
1038
1039
1040 /*******************************************************************************
1041 *
1042 * FUNCTION: AcpiDmDumpDbg2
1043 *
1044 * PARAMETERS: Table - A DBG2 table
1045 *
1046 * RETURN: None
1047 *
1048 * DESCRIPTION: Format the contents of a DBG2. This table type consists
1049 * of an open-ended number of subtables.
1050 *
1051 ******************************************************************************/
1052
1053 void
1054 AcpiDmDumpDbg2 (
1055 ACPI_TABLE_HEADER *Table)
1056 {
1057 ACPI_STATUS Status;
1058 ACPI_DBG2_DEVICE *Subtable;
1059 UINT32 Length = Table->Length;
1060 UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
1061 UINT32 i;
1062 UINT32 ArrayOffset;
1063 UINT32 AbsoluteOffset;
1064 UINT8 *Array;
1065
1066
1067 /* Main table */
1068
1069 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
1070 if (ACPI_FAILURE (Status))
1071 {
1072 return;
1073 }
1074
1075 /* Subtables */
1076
1077 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
1078 while (Offset < Table->Length)
1079 {
1080 AcpiOsPrintf ("\n");
1081 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1082 Subtable->Length, AcpiDmTableInfoDbg2Device);
1083 if (ACPI_FAILURE (Status))
1084 {
1085 return;
1086 }
1087
1088 /* Dump the BaseAddress array */
1089
1090 for (i = 0; i < Subtable->RegisterCount; i++)
1091 {
1092 ArrayOffset = Subtable->BaseAddressOffset +
1093 (sizeof (ACPI_GENERIC_ADDRESS) * i);
1094 AbsoluteOffset = Offset + ArrayOffset;
1095 Array = (UINT8 *) Subtable + ArrayOffset;
1096
1097 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1098 Subtable->Length, AcpiDmTableInfoDbg2Addr);
1099 if (ACPI_FAILURE (Status))
1100 {
1101 return;
1102 }
1103 }
1104
1105 /* Dump the AddressSize array */
1106
1107 for (i = 0; i < Subtable->RegisterCount; i++)
1108 {
1109 ArrayOffset = Subtable->AddressSizeOffset +
1110 (sizeof (UINT32) * i);
1111 AbsoluteOffset = Offset + ArrayOffset;
1112 Array = (UINT8 *) Subtable + ArrayOffset;
1113
1114 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1115 Subtable->Length, AcpiDmTableInfoDbg2Size);
1116 if (ACPI_FAILURE (Status))
1117 {
1118 return;
1119 }
1120 }
1121
1122 /* Dump the Namestring (required) */
1123
1124 AcpiOsPrintf ("\n");
1125 ArrayOffset = Subtable->NamepathOffset;
1126 AbsoluteOffset = Offset + ArrayOffset;
1127 Array = (UINT8 *) Subtable + ArrayOffset;
1128
1129 Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
1130 Subtable->Length, AcpiDmTableInfoDbg2Name);
1131 if (ACPI_FAILURE (Status))
1132 {
1133 return;
1134 }
1135
1136 /* Dump the OemData (optional) */
1137
1138 if (Subtable->OemDataOffset)
1139 {
1140 Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
1141 Table, Subtable->OemDataLength,
1142 AcpiDmTableInfoDbg2OemData);
1143 if (ACPI_FAILURE (Status))
1144 {
1145 return;
1146 }
1147 }
1148
1149 /* Point to next subtable */
1150
1151 Offset += Subtable->Length;
1152 Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
1153 Subtable->Length);
1154 }
1155 }
1156
1157
1158 /*******************************************************************************
1159 *
1160 * FUNCTION: AcpiDmDumpDmar
1161 *
1162 * PARAMETERS: Table - A DMAR table
1163 *
1164 * RETURN: None
1165 *
1166 * DESCRIPTION: Format the contents of a DMAR. This table type consists
1167 * of an open-ended number of subtables.
1168 *
1169 ******************************************************************************/
1170
1171 void
1172 AcpiDmDumpDmar (
1173 ACPI_TABLE_HEADER *Table)
1174 {
1175 ACPI_STATUS Status;
1176 ACPI_DMAR_HEADER *Subtable;
1177 UINT32 Length = Table->Length;
1178 UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
1179 ACPI_DMTABLE_INFO *InfoTable;
1180 ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
1181 UINT32 ScopeOffset;
1182 UINT8 *PciPath;
1183 UINT32 PathOffset;
1184
1185
1186 /* Main table */
1187
1188 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
1189 if (ACPI_FAILURE (Status))
1190 {
1191 return;
1192 }
1193
1194 /* Subtables */
1195
1196 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
1197 while (Offset < Table->Length)
1198 {
1199 /* Common subtable header */
1200
1201 AcpiOsPrintf ("\n");
1202 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1203 Subtable->Length, AcpiDmTableInfoDmarHdr);
1204 if (ACPI_FAILURE (Status))
1205 {
1206 return;
1207 }
1208
1209 AcpiOsPrintf ("\n");
1210
1211 switch (Subtable->Type)
1212 {
1213 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
1214
1215 InfoTable = AcpiDmTableInfoDmar0;
1216 ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
1217 break;
1218
1219 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
1220
1221 InfoTable = AcpiDmTableInfoDmar1;
1222 ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
1223 break;
1224
1225 case ACPI_DMAR_TYPE_ROOT_ATS:
1226
1227 InfoTable = AcpiDmTableInfoDmar2;
1228 ScopeOffset = sizeof (ACPI_DMAR_ATSR);
1229 break;
1230
1231 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
1232
1233 InfoTable = AcpiDmTableInfoDmar3;
1234 ScopeOffset = sizeof (ACPI_DMAR_RHSA);
1235 break;
1236
1237 case ACPI_DMAR_TYPE_NAMESPACE:
1238
1239 InfoTable = AcpiDmTableInfoDmar4;
1240 ScopeOffset = sizeof (ACPI_DMAR_ANDD);
1241 break;
1242
1243 case ACPI_DMAR_TYPE_SATC:
1244
1245 InfoTable = AcpiDmTableInfoDmar5;
1246 ScopeOffset = sizeof (ACPI_DMAR_SATC);
1247 break;
1248
1249 default:
1250
1251 AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
1252 Subtable->Type);
1253 return;
1254 }
1255
1256 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1257 Subtable->Length, InfoTable);
1258 if (ACPI_FAILURE (Status))
1259 {
1260 return;
1261 }
1262
1263 /*
1264 * Dump the optional device scope entries
1265 */
1266 if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
1267 (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
1268 {
1269 /* These types do not support device scopes */
1270
1271 goto NextSubtable;
1272 }
1273
1274 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
1275 while (ScopeOffset < Subtable->Length)
1276 {
1277 AcpiOsPrintf ("\n");
1278 Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
1279 ScopeTable->Length, AcpiDmTableInfoDmarScope);
1280 if (ACPI_FAILURE (Status))
1281 {
1282 return;
1283 }
1284 AcpiOsPrintf ("\n");
1285
1286 /* Dump the PCI Path entries for this device scope */
1287
1288 PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
1289
1290 PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
1291 sizeof (ACPI_DMAR_DEVICE_SCOPE));
1292
1293 while (PathOffset < ScopeTable->Length)
1294 {
1295 AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2,
1296 "PCI Path");
1297 AcpiOsPrintf ("%2.2X,%2.2X\n", PciPath[0], PciPath[1]);
1298
1299 /* Point to next PCI Path entry */
1300
1301 PathOffset += 2;
1302 PciPath += 2;
1303 AcpiOsPrintf ("\n");
1304 }
1305
1306 /* Point to next device scope entry */
1307
1308 ScopeOffset += ScopeTable->Length;
1309 ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
1310 ScopeTable, ScopeTable->Length);
1311 }
1312
1313 NextSubtable:
1314 /* Point to next subtable */
1315
1316 Offset += Subtable->Length;
1317 Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
1318 Subtable->Length);
1319 }
1320 }
1321
1322
1323 /*******************************************************************************
1324 *
1325 * FUNCTION: AcpiDmDumpDrtm
1326 *
1327 * PARAMETERS: Table - A DRTM table
1328 *
1329 * RETURN: None
1330 *
1331 * DESCRIPTION: Format the contents of a DRTM.
1332 *
1333 ******************************************************************************/
1334
1335 void
1336 AcpiDmDumpDrtm (
1337 ACPI_TABLE_HEADER *Table)
1338 {
1339 ACPI_STATUS Status;
1340 UINT32 Offset;
1341 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
1342 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
1343 ACPI_DRTM_DPS_ID *DrtmDps;
1344 UINT32 Count;
1345
1346
1347 /* Main table */
1348
1349 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
1350 AcpiDmTableInfoDrtm);
1351 if (ACPI_FAILURE (Status))
1352 {
1353 return;
1354 }
1355
1356 Offset = sizeof (ACPI_TABLE_DRTM);
1357
1358 /* Sub-tables */
1359
1360 /* Dump ValidatedTable length */
1361
1362 DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
1363 AcpiOsPrintf ("\n");
1364 Status = AcpiDmDumpTable (Table->Length, Offset,
1365 DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
1366 AcpiDmTableInfoDrtm0);
1367 if (ACPI_FAILURE (Status))
1368 {
1369 return;
1370 }
1371
1372 Offset += ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables);
1373
1374 /* Dump Validated table addresses */
1375
1376 Count = 0;
1377 while ((Offset < Table->Length) &&
1378 (DrtmVtl->ValidatedTableCount > Count))
1379 {
1380 Status = AcpiDmDumpTable (Table->Length, Offset,
1381 ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
1382 AcpiDmTableInfoDrtm0a);
1383 if (ACPI_FAILURE (Status))
1384 {
1385 return;
1386 }
1387
1388 Offset += sizeof (UINT64);
1389 Count++;
1390 }
1391
1392 /* Dump ResourceList length */
1393
1394 DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
1395 AcpiOsPrintf ("\n");
1396 Status = AcpiDmDumpTable (Table->Length, Offset,
1397 DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
1398 AcpiDmTableInfoDrtm1);
1399 if (ACPI_FAILURE (Status))
1400 {
1401 return;
1402 }
1403
1404 Offset += ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources);
1405
1406 /* Dump the Resource List */
1407
1408 Count = 0;
1409 while ((Offset < Table->Length) &&
1410 (DrtmRl->ResourceCount > Count))
1411 {
1412 Status = AcpiDmDumpTable (Table->Length, Offset,
1413 ACPI_ADD_PTR (void, Table, Offset),
1414 sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
1415 if (ACPI_FAILURE (Status))
1416 {
1417 return;
1418 }
1419
1420 Offset += sizeof (ACPI_DRTM_RESOURCE);
1421 Count++;
1422 }
1423
1424 /* Dump DPS */
1425
1426 DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
1427 AcpiOsPrintf ("\n");
1428 (void) AcpiDmDumpTable (Table->Length, Offset,
1429 DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
1430 }
1431
1432
1433 /*******************************************************************************
1434 *
1435 * FUNCTION: AcpiDmDumpEinj
1436 *
1437 * PARAMETERS: Table - A EINJ table
1438 *
1439 * RETURN: None
1440 *
1441 * DESCRIPTION: Format the contents of a EINJ. This table type consists
1442 * of an open-ended number of subtables.
1443 *
1444 ******************************************************************************/
1445
1446 void
1447 AcpiDmDumpEinj (
1448 ACPI_TABLE_HEADER *Table)
1449 {
1450 ACPI_STATUS Status;
1451 ACPI_WHEA_HEADER *Subtable;
1452 UINT32 Length = Table->Length;
1453 UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
1454
1455
1456 /* Main table */
1457
1458 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
1459 if (ACPI_FAILURE (Status))
1460 {
1461 return;
1462 }
1463
1464 /* Subtables */
1465
1466 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1467 while (Offset < Table->Length)
1468 {
1469 AcpiOsPrintf ("\n");
1470 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1471 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0);
1472 if (ACPI_FAILURE (Status))
1473 {
1474 return;
1475 }
1476
1477 /* Point to next subtable (each subtable is of fixed length) */
1478
1479 Offset += sizeof (ACPI_WHEA_HEADER);
1480 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1481 sizeof (ACPI_WHEA_HEADER));
1482 }
1483 }
1484
1485
1486 /*******************************************************************************
1487 *
1488 * FUNCTION: AcpiDmDumpErst
1489 *
1490 * PARAMETERS: Table - A ERST table
1491 *
1492 * RETURN: None
1493 *
1494 * DESCRIPTION: Format the contents of a ERST. This table type consists
1495 * of an open-ended number of subtables.
1496 *
1497 ******************************************************************************/
1498
1499 void
1500 AcpiDmDumpErst (
1501 ACPI_TABLE_HEADER *Table)
1502 {
1503 ACPI_STATUS Status;
1504 ACPI_WHEA_HEADER *Subtable;
1505 UINT32 Length = Table->Length;
1506 UINT32 Offset = sizeof (ACPI_TABLE_ERST);
1507
1508
1509 /* Main table */
1510
1511 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
1512 if (ACPI_FAILURE (Status))
1513 {
1514 return;
1515 }
1516
1517 /* Subtables */
1518
1519 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
1520 while (Offset < Table->Length)
1521 {
1522 AcpiOsPrintf ("\n");
1523 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1524 sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0);
1525 if (ACPI_FAILURE (Status))
1526 {
1527 return;
1528 }
1529
1530 /* Point to next subtable (each subtable is of fixed length) */
1531
1532 Offset += sizeof (ACPI_WHEA_HEADER);
1533 Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable,
1534 sizeof (ACPI_WHEA_HEADER));
1535 }
1536 }
1537
1538
1539 /*******************************************************************************
1540 *
1541 * FUNCTION: AcpiDmDumpFpdt
1542 *
1543 * PARAMETERS: Table - A FPDT table
1544 *
1545 * RETURN: None
1546 *
1547 * DESCRIPTION: Format the contents of a FPDT. This table type consists
1548 * of an open-ended number of subtables.
1549 *
1550 ******************************************************************************/
1551
1552 void
1553 AcpiDmDumpFpdt (
1554 ACPI_TABLE_HEADER *Table)
1555 {
1556 ACPI_STATUS Status;
1557 ACPI_FPDT_HEADER *Subtable;
1558 UINT32 Length = Table->Length;
1559 UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
1560 ACPI_DMTABLE_INFO *InfoTable;
1561
1562
1563 /* There is no main table (other than the standard ACPI header) */
1564
1565 /* Subtables */
1566
1567 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
1568 while (Offset < Table->Length)
1569 {
1570 /* Common subtable header */
1571
1572 AcpiOsPrintf ("\n");
1573 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1574 Subtable->Length, AcpiDmTableInfoFpdtHdr);
1575 if (ACPI_FAILURE (Status))
1576 {
1577 return;
1578 }
1579
1580 switch (Subtable->Type)
1581 {
1582 case ACPI_FPDT_TYPE_BOOT:
1583
1584 InfoTable = AcpiDmTableInfoFpdt0;
1585 break;
1586
1587 case ACPI_FPDT_TYPE_S3PERF:
1588
1589 InfoTable = AcpiDmTableInfoFpdt1;
1590 break;
1591
1592 default:
1593
1594 AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
1595 Subtable->Type);
1596
1597 /* Attempt to continue */
1598
1599 if (!Subtable->Length)
1600 {
1601 AcpiOsPrintf ("Invalid zero length subtable\n");
1602 return;
1603 }
1604 goto NextSubtable;
1605 }
1606
1607 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1608 Subtable->Length, InfoTable);
1609 if (ACPI_FAILURE (Status))
1610 {
1611 return;
1612 }
1613
1614 NextSubtable:
1615 /* Point to next subtable */
1616
1617 Offset += Subtable->Length;
1618 Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable,
1619 Subtable->Length);
1620 }
1621 }
1622
1623
1624 /*******************************************************************************
1625 *
1626 * FUNCTION: AcpiDmDumpGtdt
1627 *
1628 * PARAMETERS: Table - A GTDT table
1629 *
1630 * RETURN: None
1631 *
1632 * DESCRIPTION: Format the contents of a GTDT. This table type consists
1633 * of an open-ended number of subtables.
1634 *
1635 ******************************************************************************/
1636
1637 void
1638 AcpiDmDumpGtdt (
1639 ACPI_TABLE_HEADER *Table)
1640 {
1641 ACPI_STATUS Status;
1642 ACPI_GTDT_HEADER *Subtable;
1643 UINT32 Length = Table->Length;
1644 UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
1645 ACPI_DMTABLE_INFO *InfoTable;
1646 UINT32 SubtableLength;
1647 UINT32 GtCount;
1648 ACPI_GTDT_TIMER_ENTRY *GtxTable;
1649
1650
1651 /* Main table */
1652
1653 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
1654 if (ACPI_FAILURE (Status))
1655 {
1656 return;
1657 }
1658
1659 /* Rev 3 fields */
1660
1661 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1662
1663 if (Table->Revision > 2)
1664 {
1665 SubtableLength = sizeof (ACPI_GTDT_EL2);
1666 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1667 SubtableLength, AcpiDmTableInfoGtdtEl2);
1668 if (ACPI_FAILURE (Status))
1669 {
1670 return;
1671 }
1672 Offset += SubtableLength;
1673 }
1674
1675 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
1676
1677 /* Subtables */
1678
1679 while (Offset < Table->Length)
1680 {
1681 /* Common subtable header */
1682
1683 AcpiOsPrintf ("\n");
1684 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1685 Subtable->Length, AcpiDmTableInfoGtdtHdr);
1686 if (ACPI_FAILURE (Status))
1687 {
1688 return;
1689 }
1690
1691 GtCount = 0;
1692 switch (Subtable->Type)
1693 {
1694 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1695
1696 SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
1697 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1698 Subtable))->TimerCount;
1699
1700 InfoTable = AcpiDmTableInfoGtdt0;
1701 break;
1702
1703 case ACPI_GTDT_TYPE_WATCHDOG:
1704
1705 SubtableLength = sizeof (ACPI_GTDT_WATCHDOG);
1706
1707 InfoTable = AcpiDmTableInfoGtdt1;
1708 break;
1709
1710 default:
1711
1712 /* Cannot continue on unknown type - no length */
1713
1714 AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n",
1715 Subtable->Type);
1716 return;
1717 }
1718
1719 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1720 Subtable->Length, InfoTable);
1721 if (ACPI_FAILURE (Status))
1722 {
1723 return;
1724 }
1725
1726 /* Point to end of current subtable (each subtable above is of fixed length) */
1727
1728 Offset += SubtableLength;
1729
1730 /* If there are any Gt Timer Blocks from above, dump them now */
1731
1732 if (GtCount)
1733 {
1734 GtxTable = ACPI_ADD_PTR (
1735 ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength);
1736 SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY);
1737
1738 while (GtCount)
1739 {
1740 AcpiOsPrintf ("\n");
1741 Status = AcpiDmDumpTable (Length, Offset, GtxTable,
1742 sizeof (ACPI_GTDT_TIMER_ENTRY), AcpiDmTableInfoGtdt0a);
1743 if (ACPI_FAILURE (Status))
1744 {
1745 return;
1746 }
1747 Offset += sizeof (ACPI_GTDT_TIMER_ENTRY);
1748 GtxTable++;
1749 GtCount--;
1750 }
1751 }
1752
1753 /* Point to next subtable */
1754
1755 Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength);
1756 }
1757 }
1758
1759
1760 /*******************************************************************************
1761 *
1762 * FUNCTION: AcpiDmDumpHest
1763 *
1764 * PARAMETERS: Table - A HEST table
1765 *
1766 * RETURN: None
1767 *
1768 * DESCRIPTION: Format the contents of a HEST. This table type consists
1769 * of an open-ended number of subtables.
1770 *
1771 ******************************************************************************/
1772
1773 void
1774 AcpiDmDumpHest (
1775 ACPI_TABLE_HEADER *Table)
1776 {
1777 ACPI_STATUS Status;
1778 ACPI_HEST_HEADER *Subtable;
1779 UINT32 Length = Table->Length;
1780 UINT32 Offset = sizeof (ACPI_TABLE_HEST);
1781 ACPI_DMTABLE_INFO *InfoTable;
1782 UINT32 SubtableLength;
1783 UINT32 BankCount;
1784 ACPI_HEST_IA_ERROR_BANK *BankTable;
1785
1786
1787 /* Main table */
1788
1789 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
1790 if (ACPI_FAILURE (Status))
1791 {
1792 return;
1793 }
1794
1795 /* Subtables */
1796
1797 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
1798 while (Offset < Table->Length)
1799 {
1800 BankCount = 0;
1801 switch (Subtable->Type)
1802 {
1803 case ACPI_HEST_TYPE_IA32_CHECK:
1804
1805 InfoTable = AcpiDmTableInfoHest0;
1806 SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK);
1807 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1808 Subtable))->NumHardwareBanks;
1809 break;
1810
1811 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1812
1813 InfoTable = AcpiDmTableInfoHest1;
1814 SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED);
1815 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1816 Subtable))->NumHardwareBanks;
1817 break;
1818
1819 case ACPI_HEST_TYPE_IA32_NMI:
1820
1821 InfoTable = AcpiDmTableInfoHest2;
1822 SubtableLength = sizeof (ACPI_HEST_IA_NMI);
1823 break;
1824
1825 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1826
1827 InfoTable = AcpiDmTableInfoHest6;
1828 SubtableLength = sizeof (ACPI_HEST_AER_ROOT);
1829 break;
1830
1831 case ACPI_HEST_TYPE_AER_ENDPOINT:
1832
1833 InfoTable = AcpiDmTableInfoHest7;
1834 SubtableLength = sizeof (ACPI_HEST_AER);
1835 break;
1836
1837 case ACPI_HEST_TYPE_AER_BRIDGE:
1838
1839 InfoTable = AcpiDmTableInfoHest8;
1840 SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE);
1841 break;
1842
1843 case ACPI_HEST_TYPE_GENERIC_ERROR:
1844
1845 InfoTable = AcpiDmTableInfoHest9;
1846 SubtableLength = sizeof (ACPI_HEST_GENERIC);
1847 break;
1848
1849 case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
1850
1851 InfoTable = AcpiDmTableInfoHest10;
1852 SubtableLength = sizeof (ACPI_HEST_GENERIC_V2);
1853 break;
1854
1855 case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
1856
1857 InfoTable = AcpiDmTableInfoHest11;
1858 SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK);
1859 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
1860 Subtable))->NumHardwareBanks;
1861 break;
1862
1863 default:
1864
1865 /* Cannot continue on unknown type - no length */
1866
1867 AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n",
1868 Subtable->Type);
1869 return;
1870 }
1871
1872 AcpiOsPrintf ("\n");
1873 Status = AcpiDmDumpTable (Length, Offset, Subtable,
1874 SubtableLength, InfoTable);
1875 if (ACPI_FAILURE (Status))
1876 {
1877 return;
1878 }
1879
1880 /* Point to end of current subtable (each subtable above is of fixed length) */
1881
1882 Offset += SubtableLength;
1883
1884 /* If there are any (fixed-length) Error Banks from above, dump them now */
1885
1886 if (BankCount)
1887 {
1888 BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable,
1889 SubtableLength);
1890 SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK);
1891
1892 while (BankCount)
1893 {
1894 AcpiOsPrintf ("\n");
1895 Status = AcpiDmDumpTable (Length, Offset, BankTable,
1896 sizeof (ACPI_HEST_IA_ERROR_BANK), AcpiDmTableInfoHestBank);
1897 if (ACPI_FAILURE (Status))
1898 {
1899 return;
1900 }
1901
1902 Offset += sizeof (ACPI_HEST_IA_ERROR_BANK);
1903 BankTable++;
1904 BankCount--;
1905 }
1906 }
1907
1908 /* Point to next subtable */
1909
1910 Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength);
1911 }
1912 }
1913
1914
1915 /*******************************************************************************
1916 *
1917 * FUNCTION: AcpiDmDumpHmat
1918 *
1919 * PARAMETERS: Table - A HMAT table
1920 *
1921 * RETURN: None
1922 *
1923 * DESCRIPTION: Format the contents of a HMAT.
1924 *
1925 ******************************************************************************/
1926
1927 void
1928 AcpiDmDumpHmat (
1929 ACPI_TABLE_HEADER *Table)
1930 {
1931 ACPI_STATUS Status;
1932 ACPI_HMAT_STRUCTURE *HmatStruct;
1933 ACPI_HMAT_LOCALITY *HmatLocality;
1934 ACPI_HMAT_CACHE *HmatCache;
1935 UINT32 Offset;
1936 UINT32 SubtableOffset;
1937 UINT32 Length;
1938 ACPI_DMTABLE_INFO *InfoTable;
1939 UINT32 i, j;
1940
1941
1942 /* Main table */
1943
1944 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoHmat);
1945 if (ACPI_FAILURE (Status))
1946 {
1947 return;
1948 }
1949 Offset = sizeof (ACPI_TABLE_HMAT);
1950
1951 while (Offset < Table->Length)
1952 {
1953 AcpiOsPrintf ("\n");
1954
1955 /* Dump HMAT structure header */
1956
1957 HmatStruct = ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, Table, Offset);
1958 if (HmatStruct->Length < sizeof (ACPI_HMAT_STRUCTURE))
1959 {
1960 AcpiOsPrintf ("Invalid HMAT structure length\n");
1961 return;
1962 }
1963 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
1964 HmatStruct->Length, AcpiDmTableInfoHmatHdr);
1965 if (ACPI_FAILURE (Status))
1966 {
1967 return;
1968 }
1969
1970 switch (HmatStruct->Type)
1971 {
1972 case ACPI_HMAT_TYPE_ADDRESS_RANGE:
1973
1974 InfoTable = AcpiDmTableInfoHmat0;
1975 Length = sizeof (ACPI_HMAT_PROXIMITY_DOMAIN);
1976 break;
1977
1978 case ACPI_HMAT_TYPE_LOCALITY:
1979
1980 InfoTable = AcpiDmTableInfoHmat1;
1981 Length = sizeof (ACPI_HMAT_LOCALITY);
1982 break;
1983
1984 case ACPI_HMAT_TYPE_CACHE:
1985
1986 InfoTable = AcpiDmTableInfoHmat2;
1987 Length = sizeof (ACPI_HMAT_CACHE);
1988 break;
1989
1990 default:
1991
1992 AcpiOsPrintf ("\n**** Unknown HMAT structure type 0x%X\n",
1993 HmatStruct->Type);
1994
1995 /* Attempt to continue */
1996
1997 goto NextSubtable;
1998 }
1999
2000 /* Dump HMAT structure body */
2001
2002 if (HmatStruct->Length < Length)
2003 {
2004 AcpiOsPrintf ("Invalid HMAT structure length\n");
2005 return;
2006 }
2007 Status = AcpiDmDumpTable (Table->Length, Offset, HmatStruct,
2008 HmatStruct->Length, InfoTable);
2009 if (ACPI_FAILURE (Status))
2010 {
2011 return;
2012 }
2013
2014 /* Dump HMAT structure additional */
2015
2016 switch (HmatStruct->Type)
2017 {
2018 case ACPI_HMAT_TYPE_LOCALITY:
2019
2020 HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct);
2021 SubtableOffset = sizeof (ACPI_HMAT_LOCALITY);
2022
2023 /* Dump initiator proximity domains */
2024
2025 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2026 (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4))
2027 {
2028 AcpiOsPrintf ("Invalid initiator proximity domain number\n");
2029 return;
2030 }
2031 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
2032 {
2033 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2034 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2035 4, AcpiDmTableInfoHmat1a);
2036 if (ACPI_FAILURE (Status))
2037 {
2038 return;
2039 }
2040
2041 SubtableOffset += 4;
2042 }
2043
2044 /* Dump target proximity domains */
2045
2046 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2047 (UINT32)(HmatLocality->NumberOfTargetPDs * 4))
2048 {
2049 AcpiOsPrintf ("Invalid target proximity domain number\n");
2050 return;
2051 }
2052 for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++)
2053 {
2054 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2055 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2056 4, AcpiDmTableInfoHmat1b);
2057 if (ACPI_FAILURE (Status))
2058 {
2059 return;
2060 }
2061
2062 SubtableOffset += 4;
2063 }
2064
2065 /* Dump latency/bandwidth entris */
2066
2067 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2068 (UINT32)(HmatLocality->NumberOfInitiatorPDs *
2069 HmatLocality->NumberOfTargetPDs * 2))
2070 {
2071 AcpiOsPrintf ("Invalid latency/bandwidth entry number\n");
2072 return;
2073 }
2074 for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++)
2075 {
2076 for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++)
2077 {
2078 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2079 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2080 2, AcpiDmTableInfoHmat1c);
2081 if (ACPI_FAILURE(Status))
2082 {
2083 return;
2084 }
2085
2086 SubtableOffset += 2;
2087 }
2088 }
2089 break;
2090
2091 case ACPI_HMAT_TYPE_CACHE:
2092
2093 HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct);
2094 SubtableOffset = sizeof (ACPI_HMAT_CACHE);
2095
2096 /* Dump SMBIOS handles */
2097
2098 if ((UINT32)(HmatStruct->Length - SubtableOffset) <
2099 (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2))
2100 {
2101 AcpiOsPrintf ("Invalid SMBIOS handle number\n");
2102 return;
2103 }
2104 for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++)
2105 {
2106 Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset,
2107 ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset),
2108 2, AcpiDmTableInfoHmat2a);
2109 if (ACPI_FAILURE (Status))
2110 {
2111 return;
2112 }
2113
2114 SubtableOffset += 2;
2115 }
2116 break;
2117
2118 default:
2119
2120 break;
2121 }
2122
2123 NextSubtable:
2124 /* Point to next HMAT structure subtable */
2125
2126 Offset += (HmatStruct->Length);
2127 }
2128 }
2129