dmtbdump3.c revision 1.1.1.5
1/****************************************************************************** 2 * 3 * Module Name: dmtbdump3 - Dump ACPI data tables that contain no AML code 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2020, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44#include "acpi.h" 45#include "accommon.h" 46#include "acdisasm.h" 47#include "actables.h" 48 49/* This module used for application-level code only */ 50 51#define _COMPONENT ACPI_CA_DISASSEMBLER 52 ACPI_MODULE_NAME ("dmtbdump3") 53 54 55/******************************************************************************* 56 * 57 * FUNCTION: AcpiDmDumpSlic 58 * 59 * PARAMETERS: Table - A SLIC table 60 * 61 * RETURN: None 62 * 63 * DESCRIPTION: Format the contents of a SLIC 64 * 65 ******************************************************************************/ 66 67void 68AcpiDmDumpSlic ( 69 ACPI_TABLE_HEADER *Table) 70{ 71 72 (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table, 73 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic); 74} 75 76 77/******************************************************************************* 78 * 79 * FUNCTION: AcpiDmDumpSlit 80 * 81 * PARAMETERS: Table - An SLIT 82 * 83 * RETURN: None 84 * 85 * DESCRIPTION: Format the contents of a SLIT 86 * 87 ******************************************************************************/ 88 89void 90AcpiDmDumpSlit ( 91 ACPI_TABLE_HEADER *Table) 92{ 93 ACPI_STATUS Status; 94 UINT32 Offset; 95 UINT8 *Row; 96 UINT32 Localities; 97 UINT32 i; 98 UINT32 j; 99 100 101 /* Main table */ 102 103 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit); 104 if (ACPI_FAILURE (Status)) 105 { 106 return; 107 } 108 109 /* Display the Locality NxN Matrix */ 110 111 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount; 112 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]); 113 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry; 114 115 for (i = 0; i < Localities; i++) 116 { 117 /* Display one row of the matrix */ 118 119 AcpiDmLineHeader2 (Offset, Localities, "Locality", i); 120 for (j = 0; j < Localities; j++) 121 { 122 /* Check for beyond EOT */ 123 124 if (Offset >= Table->Length) 125 { 126 AcpiOsPrintf ( 127 "\n**** Not enough room in table for all localities\n"); 128 return; 129 } 130 131 AcpiOsPrintf ("%2.2X", Row[j]); 132 Offset++; 133 134 /* Display up to 16 bytes per output row */ 135 136 if ((j+1) < Localities) 137 { 138 AcpiOsPrintf (" "); 139 140 if (j && (((j+1) % 16) == 0)) 141 { 142 AcpiOsPrintf ("\\\n"); /* With line continuation char */ 143 AcpiDmLineHeader (Offset, 0, NULL); 144 } 145 } 146 } 147 148 /* Point to next row */ 149 150 AcpiOsPrintf ("\n"); 151 Row += Localities; 152 } 153} 154 155 156/******************************************************************************* 157 * 158 * FUNCTION: AcpiDmDumpSrat 159 * 160 * PARAMETERS: Table - A SRAT table 161 * 162 * RETURN: None 163 * 164 * DESCRIPTION: Format the contents of a SRAT 165 * 166 ******************************************************************************/ 167 168void 169AcpiDmDumpSrat ( 170 ACPI_TABLE_HEADER *Table) 171{ 172 ACPI_STATUS Status; 173 UINT32 Offset = sizeof (ACPI_TABLE_SRAT); 174 ACPI_SUBTABLE_HEADER *Subtable; 175 ACPI_DMTABLE_INFO *InfoTable; 176 177 178 /* Main table */ 179 180 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat); 181 if (ACPI_FAILURE (Status)) 182 { 183 return; 184 } 185 186 /* Subtables */ 187 188 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); 189 while (Offset < Table->Length) 190 { 191 /* Common subtable header */ 192 193 AcpiOsPrintf ("\n"); 194 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 195 Subtable->Length, AcpiDmTableInfoSratHdr); 196 if (ACPI_FAILURE (Status)) 197 { 198 return; 199 } 200 201 switch (Subtable->Type) 202 { 203 case ACPI_SRAT_TYPE_CPU_AFFINITY: 204 205 InfoTable = AcpiDmTableInfoSrat0; 206 break; 207 208 case ACPI_SRAT_TYPE_MEMORY_AFFINITY: 209 210 InfoTable = AcpiDmTableInfoSrat1; 211 break; 212 213 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: 214 215 InfoTable = AcpiDmTableInfoSrat2; 216 break; 217 218 case ACPI_SRAT_TYPE_GICC_AFFINITY: 219 220 InfoTable = AcpiDmTableInfoSrat3; 221 break; 222 223 case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY: 224 225 InfoTable = AcpiDmTableInfoSrat4; 226 break; 227 228 case ACPI_SRAT_TYPE_GENERIC_AFFINITY: 229 230 InfoTable = AcpiDmTableInfoSrat5; 231 break; 232 233 default: 234 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", 235 Subtable->Type); 236 237 /* Attempt to continue */ 238 239 if (!Subtable->Length) 240 { 241 AcpiOsPrintf ("Invalid zero length subtable\n"); 242 return; 243 } 244 goto NextSubtable; 245 } 246 247 AcpiOsPrintf ("\n"); 248 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 249 Subtable->Length, InfoTable); 250 if (ACPI_FAILURE (Status)) 251 { 252 return; 253 } 254 255NextSubtable: 256 /* Point to next subtable */ 257 258 Offset += Subtable->Length; 259 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, 260 Subtable->Length); 261 } 262} 263 264 265/******************************************************************************* 266 * 267 * FUNCTION: AcpiDmDumpStao 268 * 269 * PARAMETERS: Table - A STAO table 270 * 271 * RETURN: None 272 * 273 * DESCRIPTION: Format the contents of a STAO. This is a variable-length 274 * table that contains an open-ended number of ASCII strings 275 * at the end of the table. 276 * 277 ******************************************************************************/ 278 279void 280AcpiDmDumpStao ( 281 ACPI_TABLE_HEADER *Table) 282{ 283 ACPI_STATUS Status; 284 char *Namepath; 285 UINT32 Length = Table->Length; 286 UINT32 StringLength; 287 UINT32 Offset = sizeof (ACPI_TABLE_STAO); 288 289 290 /* Main table */ 291 292 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao); 293 if (ACPI_FAILURE (Status)) 294 { 295 return; 296 } 297 298 /* The rest of the table consists of Namepath strings */ 299 300 while (Offset < Table->Length) 301 { 302 Namepath = ACPI_ADD_PTR (char, Table, Offset); 303 StringLength = strlen (Namepath) + 1; 304 305 AcpiDmLineHeader (Offset, StringLength, "Namepath"); 306 AcpiOsPrintf ("\"%s\"\n", Namepath); 307 308 /* Point to next namepath */ 309 310 Offset += StringLength; 311 } 312} 313 314 315/******************************************************************************* 316 * 317 * FUNCTION: AcpiDmDumpTcpa 318 * 319 * PARAMETERS: Table - A TCPA table 320 * 321 * RETURN: None 322 * 323 * DESCRIPTION: Format the contents of a TCPA. 324 * 325 * NOTE: There are two versions of the table with the same signature: 326 * the client version and the server version. The common 327 * PlatformClass field is used to differentiate the two types of 328 * tables. 329 * 330 ******************************************************************************/ 331 332void 333AcpiDmDumpTcpa ( 334 ACPI_TABLE_HEADER *Table) 335{ 336 UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR); 337 ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR ( 338 ACPI_TABLE_TCPA_HDR, Table); 339 ACPI_TABLE_TCPA_HDR *Subtable = ACPI_ADD_PTR ( 340 ACPI_TABLE_TCPA_HDR, Table, Offset); 341 ACPI_STATUS Status; 342 343 344 /* Main table */ 345 346 Status = AcpiDmDumpTable (Table->Length, 0, Table, 347 0, AcpiDmTableInfoTcpaHdr); 348 if (ACPI_FAILURE (Status)) 349 { 350 return; 351 } 352 353 /* 354 * Examine the PlatformClass field to determine the table type. 355 * Either a client or server table. Only one. 356 */ 357 switch (CommonHeader->PlatformClass) 358 { 359 case ACPI_TCPA_CLIENT_TABLE: 360 361 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 362 Table->Length - Offset, AcpiDmTableInfoTcpaClient); 363 break; 364 365 case ACPI_TCPA_SERVER_TABLE: 366 367 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 368 Table->Length - Offset, AcpiDmTableInfoTcpaServer); 369 break; 370 371 default: 372 373 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n", 374 CommonHeader->PlatformClass); 375 Status = AE_ERROR; 376 break; 377 } 378 379 if (ACPI_FAILURE (Status)) 380 { 381 AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n"); 382 } 383} 384 385 386/******************************************************************************* 387 * 388 * FUNCTION: AcpiDmDumpTpm2 389 * 390 * PARAMETERS: Table - A TPM2 table 391 * 392 * RETURN: None 393 * 394 * DESCRIPTION: Format the contents of a TPM2. 395 * 396 ******************************************************************************/ 397static void 398AcpiDmDumpTpm2Rev3 ( 399 ACPI_TABLE_HEADER *Table) 400{ 401 UINT32 Offset = sizeof (ACPI_TABLE_TPM23); 402 ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table); 403 ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset); 404 ACPI_STATUS Status; 405 406 407 /* Main table */ 408 409 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23); 410 if (ACPI_FAILURE (Status)) 411 { 412 return; 413 } 414 415 /* Optional subtable if start method is ACPI start method */ 416 417 switch (CommonHeader->StartMethod) 418 { 419 case ACPI_TPM23_ACPI_START_METHOD: 420 421 (void) AcpiDmDumpTable (Table->Length, Offset, Subtable, 422 Table->Length - Offset, AcpiDmTableInfoTpm23a); 423 break; 424 425 default: 426 break; 427 } 428} 429 430 431/******************************************************************************* 432 * 433 * FUNCTION: AcpiDmDumpTpm2 434 * 435 * PARAMETERS: Table - A TPM2 table 436 * 437 * RETURN: None 438 * 439 * DESCRIPTION: Format the contents of a TPM2. 440 * 441 ******************************************************************************/ 442 443void 444AcpiDmDumpTpm2 ( 445 ACPI_TABLE_HEADER *Table) 446{ 447 UINT32 Offset = sizeof (ACPI_TABLE_TPM2); 448 ACPI_TABLE_TPM2 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM2, Table); 449 ACPI_TPM2_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset); 450 ACPI_TPM2_ARM_SMC *ArmSubtable; 451 ACPI_STATUS Status; 452 453 454 if (Table->Revision == 3) 455 { 456 AcpiDmDumpTpm2Rev3(Table); 457 return; 458 } 459 460 /* Main table */ 461 462 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); 463 464 if (ACPI_FAILURE (Status)) 465 { 466 return; 467 } 468 469 AcpiOsPrintf ("\n"); 470 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 471 Table->Length - Offset, AcpiDmTableInfoTpm2a); 472 if (ACPI_FAILURE (Status)) 473 { 474 return; 475 } 476 477 switch (CommonHeader->StartMethod) 478 { 479 case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: 480 481 ArmSubtable = ACPI_ADD_PTR (ACPI_TPM2_ARM_SMC, Subtable, 482 sizeof (ACPI_TPM2_TRAILER)); 483 Offset += sizeof (ACPI_TPM2_TRAILER); 484 485 AcpiOsPrintf ("\n"); 486 (void) AcpiDmDumpTable (Table->Length, Offset, ArmSubtable, 487 Table->Length - Offset, AcpiDmTableInfoTpm211); 488 break; 489 490 default: 491 break; 492 } 493} 494 495 496/******************************************************************************* 497 * 498 * FUNCTION: AcpiDmDumpVrtc 499 * 500 * PARAMETERS: Table - A VRTC table 501 * 502 * RETURN: None 503 * 504 * DESCRIPTION: Format the contents of a VRTC 505 * 506 ******************************************************************************/ 507 508void 509AcpiDmDumpVrtc ( 510 ACPI_TABLE_HEADER *Table) 511{ 512 ACPI_STATUS Status; 513 UINT32 Offset = sizeof (ACPI_TABLE_VRTC); 514 ACPI_VRTC_ENTRY *Subtable; 515 516 517 /* Main table */ 518 519 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc); 520 if (ACPI_FAILURE (Status)) 521 { 522 return; 523 } 524 525 /* Subtables */ 526 527 Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); 528 while (Offset < Table->Length) 529 { 530 /* Common subtable header */ 531 532 AcpiOsPrintf ("\n"); 533 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 534 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0); 535 if (ACPI_FAILURE (Status)) 536 { 537 return; 538 } 539 540 /* Point to next subtable */ 541 542 Offset += sizeof (ACPI_VRTC_ENTRY); 543 Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Subtable, 544 sizeof (ACPI_VRTC_ENTRY)); 545 } 546} 547 548 549/******************************************************************************* 550 * 551 * FUNCTION: AcpiDmDumpWdat 552 * 553 * PARAMETERS: Table - A WDAT table 554 * 555 * RETURN: None 556 * 557 * DESCRIPTION: Format the contents of a WDAT 558 * 559 ******************************************************************************/ 560 561void 562AcpiDmDumpWdat ( 563 ACPI_TABLE_HEADER *Table) 564{ 565 ACPI_STATUS Status; 566 UINT32 Offset = sizeof (ACPI_TABLE_WDAT); 567 ACPI_WDAT_ENTRY *Subtable; 568 569 570 /* Main table */ 571 572 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat); 573 if (ACPI_FAILURE (Status)) 574 { 575 return; 576 } 577 578 /* Subtables */ 579 580 Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); 581 while (Offset < Table->Length) 582 { 583 /* Common subtable header */ 584 585 AcpiOsPrintf ("\n"); 586 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, 587 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); 588 if (ACPI_FAILURE (Status)) 589 { 590 return; 591 } 592 593 /* Point to next subtable */ 594 595 Offset += sizeof (ACPI_WDAT_ENTRY); 596 Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Subtable, 597 sizeof (ACPI_WDAT_ENTRY)); 598 } 599} 600 601 602/******************************************************************************* 603 * 604 * FUNCTION: AcpiDmDumpWpbt 605 * 606 * PARAMETERS: Table - A WPBT table 607 * 608 * RETURN: None 609 * 610 * DESCRIPTION: Format the contents of a WPBT. This table type consists 611 * of an open-ended arguments buffer at the end of the table. 612 * 613 ******************************************************************************/ 614 615void 616AcpiDmDumpWpbt ( 617 ACPI_TABLE_HEADER *Table) 618{ 619 ACPI_STATUS Status; 620 ACPI_TABLE_WPBT *Subtable; 621 UINT32 Length = Table->Length; 622 UINT16 ArgumentsLength; 623 624 625 /* Dump the main table */ 626 627 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt); 628 if (ACPI_FAILURE (Status)) 629 { 630 return; 631 } 632 633 /* Extract the arguments buffer length from the main table */ 634 635 Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); 636 ArgumentsLength = Subtable->ArgumentsLength; 637 638 /* Dump the arguments buffer */ 639 640 (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength, 641 AcpiDmTableInfoWpbt0); 642} 643