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