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