1/******************************************************************************* 2 * 3 * Module Name: dmobject - ACPI object decode and display
|
4 * $Revision: 6 $
|
4 * $Revision: 11 $ |
5 * 6 ******************************************************************************/ 7 8/****************************************************************************** 9 * 10 * 1. Copyright Notice 11 *
|
12 * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp.
|
12 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. |
13 * All rights reserved. 14 * 15 * 2. License 16 * 17 * 2.1. This is your license from Intel Corp. under its intellectual property 18 * rights. You may have additional license terms from the party that provided 19 * you this software, covering your right to use that party's intellectual 20 * property rights. 21 * 22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23 * copy of the source code appearing in this file ("Covered Code") an 24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25 * base code distributed originally by Intel ("Original Intel Code") to copy, 26 * make derivatives, distribute, use and display any portion of the Covered 27 * Code in any form, with the right to sublicense such rights; and 28 * 29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30 * license (with the right to sublicense), under only those claims of Intel 31 * patents that are infringed by the Original Intel Code, to make, use, sell, 32 * offer to sell, and import the Covered Code and derivative works thereof 33 * solely to the minimum extent necessary to exercise the above copyright 34 * license, and in no event shall the patent license extend to any additions 35 * to or modifications of the Original Intel Code. No other license or right 36 * is granted directly or by implication, estoppel or otherwise; 37 * 38 * The above copyright and patent license is granted only if the following 39 * conditions are met: 40 * 41 * 3. Conditions 42 * 43 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44 * Redistribution of source code of any substantial portion of the Covered 45 * Code or modification with rights to further distribute source must include 46 * the above Copyright Notice, the above License, this list of Conditions, 47 * and the following Disclaimer and Export Compliance provision. In addition, 48 * Licensee must cause all Covered Code to which Licensee contributes to 49 * contain a file documenting the changes Licensee made to create that Covered 50 * Code and the date of any change. Licensee must include in that file the 51 * documentation of any changes made by any predecessor Licensee. Licensee 52 * must include a prominent statement that the modification is derived, 53 * directly or indirectly, from Original Intel Code. 54 * 55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56 * Redistribution of source code of any substantial portion of the Covered 57 * Code or modification without rights to further distribute source must 58 * include the following Disclaimer and Export Compliance provision in the 59 * documentation and/or other materials provided with distribution. In 60 * addition, Licensee may not authorize further sublicense of source of any 61 * portion of the Covered Code, and must include terms to the effect that the 62 * license from Licensee to its licensee is limited to the intellectual 63 * property embodied in the software Licensee provides to its licensee, and 64 * not to intellectual property embodied in modifications its licensee may 65 * make. 66 * 67 * 3.3. Redistribution of Executable. Redistribution in executable form of any 68 * substantial portion of the Covered Code or modification must reproduce the 69 * above Copyright Notice, and the following Disclaimer and Export Compliance 70 * provision in the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3.4. Intel retains all right, title, and interest in and to the Original 74 * Intel Code. 75 * 76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77 * Intel shall be used in advertising or otherwise to promote the sale, use or 78 * other dealings in products derived from or relating to the Covered Code 79 * without prior written authorization from Intel. 80 * 81 * 4. Disclaimer and Export Compliance 82 * 83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89 * PARTICULAR PURPOSE. 90 * 91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98 * LIMITED REMEDY. 99 * 100 * 4.3. Licensee shall not export, either directly or indirectly, any of this 101 * software or system incorporating such software without first obtaining any 102 * required license or other approval from the U. S. Department of Commerce or 103 * any other agency or department of the United States Government. In the 104 * event Licensee exports any such software from the United States or 105 * re-exports any such software from a foreign destination, Licensee shall 106 * ensure that the distribution and export/re-export of the software is in 107 * compliance with all laws, regulations, orders, or other restrictions of the 108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109 * any of its subsidiaries will export/re-export any technical data, process, 110 * software, or service, directly or indirectly, to any country for which the 111 * United States government or any agency thereof requires an export license, 112 * other governmental approval, or letter of assurance, without first obtaining 113 * such license, approval or letter. 114 * 115 *****************************************************************************/ 116 117 118#include "acpi.h" 119#include "amlcode.h" 120#include "acnamesp.h" 121#include "acdisasm.h" 122#include "acparser.h" 123 124 125#ifdef ACPI_DISASSEMBLER 126 127#define _COMPONENT ACPI_CA_DEBUGGER 128 ACPI_MODULE_NAME ("dmnames") 129 130 131/***************************************************************************** 132 * 133 * FUNCTION: AcpiDmDumpMethodInfo 134 * 135 * PARAMETERS: Status - Method execution status 136 * WalkState - Current state of the parse tree walk 137 * Op - Executing parse op 138 * 139 * RETURN: None 140 * 141 * DESCRIPTION: Called when a method has been aborted because of an error. 142 * Dumps the method execution stack, and the method locals/args, 143 * and disassembles the AML opcode that failed. 144 * 145 ****************************************************************************/ 146 147void 148AcpiDmDumpMethodInfo ( 149 ACPI_STATUS Status, 150 ACPI_WALK_STATE *WalkState, 151 ACPI_PARSE_OBJECT *Op) 152{ 153 ACPI_PARSE_OBJECT *Next; 154 ACPI_THREAD_STATE *Thread; 155 ACPI_WALK_STATE *NextWalkState; 156 ACPI_NAMESPACE_NODE *PreviousMethod = NULL; 157 158 159 /* Ignore control codes, they are not errors */ 160 161 if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL) 162 { 163 return; 164 } 165 166 /* We may be executing a deferred opcode */ 167 168 if (WalkState->DeferredNode) 169 { 170 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); 171 return; 172 } 173 174 /* Display exception and method name */ 175 176 AcpiOsPrintf ("\n**** Exception %s during execution of method ", 177 AcpiFormatException (Status)); 178 AcpiNsPrintNodePathname (WalkState->MethodNode, NULL); 179 180 /* Display stack of executing methods */ 181 182 AcpiOsPrintf ("\n\nMethod Execution Stack:\n"); 183 Thread = WalkState->Thread; 184 NextWalkState = Thread->WalkStateList; 185 186 /* Walk list of linked walk states */ 187 188 while (NextWalkState) 189 { 190 AcpiOsPrintf (" Method [%4.4s] executing: ", 191 AcpiUtGetNodeName (NextWalkState->MethodNode)); 192 193 /* First method is the currently executing method */ 194 195 if (NextWalkState == WalkState) 196 { 197 /* Display currently executing ASL statement */ 198 199 Next = Op->Common.Next; 200 Op->Common.Next = NULL; 201 202 AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX); 203 Op->Common.Next = Next; 204 } 205 else 206 { 207 /* 208 * This method has called another method 209 * NOTE: the method call parse subtree is already deleted at this 210 * point, so we cannot disassemble the method invocation. 211 */ 212 AcpiOsPrintf ("Call to method "); 213 AcpiNsPrintNodePathname (PreviousMethod, NULL); 214 } 215 216 PreviousMethod = NextWalkState->MethodNode; 217 NextWalkState = NextWalkState->Next; 218 AcpiOsPrintf ("\n"); 219 } 220 221 /* Display the method locals and arguments */ 222 223 AcpiOsPrintf ("\n"); 224 AcpiDmDisplayLocals (WalkState); 225 AcpiOsPrintf ("\n"); 226 AcpiDmDisplayArguments (WalkState); 227 AcpiOsPrintf ("\n"); 228} 229 230 231/******************************************************************************* 232 * 233 * FUNCTION: AcpiDmDecodeInternalObject 234 * 235 * PARAMETERS: ObjDesc - Object to be displayed 236 * 237 * RETURN: None 238 * 239 * DESCRIPTION: Short display of an internal object. Numbers and Strings. 240 * 241 ******************************************************************************/ 242 243void 244AcpiDmDecodeInternalObject ( 245 ACPI_OPERAND_OBJECT *ObjDesc) 246{ 247 UINT32 i; 248 249 250 if (!ObjDesc) 251 { 252 AcpiOsPrintf (" Uninitialized"); 253 return; 254 } 255 256 if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) 257 { 258 AcpiOsPrintf (" %p [%s]", ObjDesc, AcpiUtGetDescriptorName (ObjDesc)); 259 return; 260 } 261 262 AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc)); 263 264 switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 265 { 266 case ACPI_TYPE_INTEGER: 267
|
268 AcpiOsPrintf (" %8.8X%8.8X",
|
268 AcpiOsPrintf (" %8.8X%8.8X", |
269 ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); 270 break; 271 272 273 case ACPI_TYPE_STRING: 274 275 AcpiOsPrintf ("(%d) \"%.24s", 276 ObjDesc->String.Length, ObjDesc->String.Pointer); 277 278 if (ObjDesc->String.Length > 24) 279 { 280 AcpiOsPrintf ("..."); 281 } 282 else 283 { 284 AcpiOsPrintf ("\""); 285 } 286 break; 287 288 289 case ACPI_TYPE_BUFFER: 290 291 AcpiOsPrintf ("(%d)", ObjDesc->Buffer.Length); 292 for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++) 293 { 294 AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]); 295 } 296 break; 297 298 299 default: 300 301 AcpiOsPrintf (" %p", ObjDesc); 302 break; 303 } 304} 305 306 307/******************************************************************************* 308 * 309 * FUNCTION: AcpiDmDecodeNode 310 * 311 * PARAMETERS: Node - Object to be displayed 312 * 313 * RETURN: None 314 * 315 * DESCRIPTION: Short display of a namespace node 316 * 317 ******************************************************************************/ 318 319void 320AcpiDmDecodeNode ( 321 ACPI_NAMESPACE_NODE *Node) 322{ 323 324 325 AcpiOsPrintf ("<Node> Name %4.4s", 326 AcpiUtGetNodeName (Node)); 327 328 if (Node->Flags & ANOBJ_METHOD_ARG) 329 { 330 AcpiOsPrintf (" [Method Arg]"); 331 } 332 if (Node->Flags & ANOBJ_METHOD_LOCAL) 333 { 334 AcpiOsPrintf (" [Method Local]"); 335 } 336 337 AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node)); 338} 339 340 341/******************************************************************************* 342 * 343 * FUNCTION: AcpiDmDisplayInternalObject 344 * 345 * PARAMETERS: ObjDesc - Object to be displayed 346 * WalkState - Current walk state 347 * 348 * RETURN: None 349 * 350 * DESCRIPTION: Short display of an internal object 351 * 352 ******************************************************************************/ 353 354void 355AcpiDmDisplayInternalObject ( 356 ACPI_OPERAND_OBJECT *ObjDesc, 357 ACPI_WALK_STATE *WalkState) 358{ 359 UINT8 Type; 360 361 362 AcpiOsPrintf ("%p ", ObjDesc); 363 364 if (!ObjDesc) 365 { 366 AcpiOsPrintf ("<NullObj>\n"); 367 return; 368 } 369 370 /* Decode the object type */ 371 372 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) 373 { 374 case ACPI_DESC_TYPE_PARSER: 375 376 AcpiOsPrintf ("<Parser> "); 377 break; 378 379 380 case ACPI_DESC_TYPE_NAMED: 381 382 AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc); 383 break; 384 385 386 case ACPI_DESC_TYPE_OPERAND: 387 388 Type = ACPI_GET_OBJECT_TYPE (ObjDesc); 389 if (Type > ACPI_TYPE_LOCAL_MAX) 390 { 391 AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type); 392 return; 393 } 394 395 /* Decode the ACPI object type */ 396 397 switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 398 { 399 case ACPI_TYPE_LOCAL_REFERENCE: 400 401 switch (ObjDesc->Reference.Opcode) 402 { 403 case AML_LOCAL_OP: 404 405 AcpiOsPrintf ("[Local%d] ", ObjDesc->Reference.Offset); 406 if (WalkState) 407 { 408 ObjDesc = WalkState->LocalVariables[ObjDesc->Reference.Offset].Object; 409 AcpiOsPrintf ("%p", ObjDesc); 410 AcpiDmDecodeInternalObject (ObjDesc); 411 } 412 break; 413 414 415 case AML_ARG_OP: 416 417 AcpiOsPrintf ("[Arg%d] ", ObjDesc->Reference.Offset); 418 if (WalkState) 419 { 420 ObjDesc = WalkState->Arguments[ObjDesc->Reference.Offset].Object; 421 AcpiOsPrintf ("%p", ObjDesc); 422 AcpiDmDecodeInternalObject (ObjDesc); 423 } 424 break; 425 426 427 case AML_DEBUG_OP: 428 429 AcpiOsPrintf ("[Debug] "); 430 break; 431 432 433 case AML_INDEX_OP: 434
|
435 AcpiOsPrintf ("[Index] ");
436 if (!ObjDesc->Reference.Where)
|
435 AcpiOsPrintf ("[Index] "); 436 switch (ObjDesc->Reference.TargetType) |
437 {
|
438 AcpiOsPrintf ("Uninitialized WHERE ptr");
|
438 case ACPI_TYPE_BUFFER_FIELD: 439 AcpiOsPrintf ("%p", ObjDesc->Reference.Object); 440 AcpiDmDecodeInternalObject (ObjDesc->Reference.Object); 441 break; 442 443 case ACPI_TYPE_PACKAGE: 444 445 AcpiOsPrintf ("%p", ObjDesc->Reference.Where); 446 if (!ObjDesc->Reference.Where) 447 { 448 AcpiOsPrintf (" Uninitialized WHERE ptr"); 449 } 450 else 451 { 452 AcpiDmDecodeInternalObject (*(ObjDesc->Reference.Where)); 453 } 454 break; 455 456 default: 457 AcpiOsPrintf ("Unknown index target type"); 458 break; |
459 }
|
440 else
441 {
442 AcpiDmDecodeInternalObject (*(ObjDesc->Reference.Where));
443 }
|
460 break; 461 462 463 case AML_LOAD_OP: 464 465 AcpiOsPrintf ("[DdbHandle] "); 466 break; 467 468
|
453 case AML_REF_OF_OP:
|
469 case AML_REF_OF_OP: |
470 471 AcpiOsPrintf ("[RefOf] "); 472
|
473 if (!ObjDesc->Reference.Object) 474 { 475 AcpiOsPrintf ("Uninitialized reference subobject ptr"); 476 break; 477 } 478 |
479 /* Reference can be to a Node or an Operand object */ 480 481 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object)) 482 { 483 case ACPI_DESC_TYPE_NAMED: 484 AcpiDmDecodeNode (ObjDesc->Reference.Object); 485 break; 486 487 case ACPI_DESC_TYPE_OPERAND: 488 AcpiDmDecodeInternalObject (ObjDesc->Reference.Object); 489 break; 490 491 default: 492 break; 493 } 494 break; 495 496 497 default: 498 499 AcpiOsPrintf ("Unknown Reference opcode %X (%s)\n", 500 ObjDesc->Reference.Opcode, 501 AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode)); 502 break; 503 } 504 break; 505 506 default: 507
|
486 AcpiOsPrintf (" ");
487 AcpiOsPrintf (" ");
|
508 AcpiOsPrintf ("<Obj> "); |
509 AcpiDmDecodeInternalObject (ObjDesc); 510 break; 511 } 512 break; 513 514 515 default: 516
|
496 AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]",
|
517 AcpiOsPrintf (" [%s]", |
518 AcpiUtGetDescriptorName (ObjDesc)); 519 break; 520 } 521 522 AcpiOsPrintf ("\n"); 523} 524 525 526/******************************************************************************* 527 * 528 * FUNCTION: AcpiDmDisplayLocals 529 * 530 * PARAMETERS: None 531 * 532 * RETURN: None 533 * 534 * DESCRIPTION: Display all locals for the currently running control method 535 * 536 ******************************************************************************/ 537 538void 539AcpiDmDisplayLocals ( 540 ACPI_WALK_STATE *WalkState) 541{ 542 UINT32 i; 543 ACPI_OPERAND_OBJECT *ObjDesc; 544 ACPI_NAMESPACE_NODE *Node; 545 546 547 ObjDesc = WalkState->MethodDesc; 548 Node = WalkState->MethodNode; 549 if (!Node) 550 { 551 AcpiOsPrintf ("No method node (Executing subtree for buffer or opregion)\n"); 552 return; 553 } 554 555 if (Node->Type != ACPI_TYPE_METHOD) 556 { 557 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); 558 return; 559 } 560 561 AcpiOsPrintf ("Local Variables for method [%4.4s]:\n", 562 AcpiUtGetNodeName (Node)); 563 564 for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) 565 { 566 ObjDesc = WalkState->LocalVariables[i].Object; 567 AcpiOsPrintf (" Local%X: ", i); 568 AcpiDmDisplayInternalObject (ObjDesc, WalkState); 569 } 570} 571 572 573/******************************************************************************* 574 * 575 * FUNCTION: AcpiDmDisplayArguments 576 * 577 * PARAMETERS: None 578 * 579 * RETURN: None 580 * 581 * DESCRIPTION: Display all arguments for the currently running control method 582 * 583 ******************************************************************************/ 584 585void 586AcpiDmDisplayArguments ( 587 ACPI_WALK_STATE *WalkState) 588{ 589 UINT32 i; 590 ACPI_OPERAND_OBJECT *ObjDesc; 591 UINT32 NumArgs; 592 UINT32 Concurrency; 593 ACPI_NAMESPACE_NODE *Node; 594 595 596 ObjDesc = WalkState->MethodDesc; 597 Node = WalkState->MethodNode; 598 if (!Node) 599 { 600 AcpiOsPrintf ("No method node (Executing subtree for buffer or opregion)\n"); 601 return; 602 } 603 604 if (Node->Type != ACPI_TYPE_METHOD) 605 { 606 AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n"); 607 return; 608 } 609 610 NumArgs = ObjDesc->Method.ParamCount; 611 Concurrency = ObjDesc->Method.Concurrency; 612 613 AcpiOsPrintf ("Arguments for Method [%4.4s]: (%X arguments defined, max concurrency = %X)\n", 614 AcpiUtGetNodeName (Node), NumArgs, Concurrency); 615 616 for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) 617 { 618 ObjDesc = WalkState->Arguments[i].Object; 619 AcpiOsPrintf (" Arg%d: ", i); 620 AcpiDmDisplayInternalObject (ObjDesc, WalkState); 621 } 622} 623 624#endif 625 626
|