1 /******************************************************************************* 2 * 3 * Module Name: dbdisply - debug display commands 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 45 #include "acpi.h" 46 #include "accommon.h" 47 #include "amlcode.h" 48 #include "acdispat.h" 49 #include "acnamesp.h" 50 #include "acparser.h" 51 #include "acinterp.h" 52 #include "acdebug.h" 53 #include "acdisasm.h" 54 55 56 #ifdef ACPI_DEBUGGER 57 58 #define _COMPONENT ACPI_CA_DEBUGGER 59 ACPI_MODULE_NAME ("dbdisply") 60 61 /* Local prototypes */ 62 63 static void 64 AcpiDbDumpParserDescriptor ( 65 ACPI_PARSE_OBJECT *Op); 66 67 static void * 68 AcpiDbGetPointer ( 69 void *Target); 70 71 72 /* 73 * System handler information. 74 * Used for Handlers command, in AcpiDbDisplayHandlers. 75 */ 76 #define ACPI_PREDEFINED_PREFIX "%25s (%.2X) : " 77 #define ACPI_HANDLER_NAME_STRING "%30s : " 78 #define ACPI_HANDLER_PRESENT_STRING "%-9s (%p)\n" 79 #define ACPI_HANDLER_NOT_PRESENT_STRING "%-9s\n" 80 81 /* All predefined Address Space IDs */ 82 83 static ACPI_ADR_SPACE_TYPE AcpiGbl_SpaceIdList[] = 84 { 85 ACPI_ADR_SPACE_SYSTEM_MEMORY, 86 ACPI_ADR_SPACE_SYSTEM_IO, 87 ACPI_ADR_SPACE_PCI_CONFIG, 88 ACPI_ADR_SPACE_EC, 89 ACPI_ADR_SPACE_SMBUS, 90 ACPI_ADR_SPACE_CMOS, 91 ACPI_ADR_SPACE_PCI_BAR_TARGET, 92 ACPI_ADR_SPACE_IPMI, 93 ACPI_ADR_SPACE_DATA_TABLE, 94 ACPI_ADR_SPACE_FIXED_HARDWARE 95 }; 96 97 /* Global handler information */ 98 99 typedef struct acpi_handler_info 100 { 101 void *Handler; 102 char *Name; 103 104 } ACPI_HANDLER_INFO; 105 106 static ACPI_HANDLER_INFO AcpiGbl_HandlerList[] = 107 { 108 {&AcpiGbl_SystemNotify.Handler, "System Notifications"}, 109 {&AcpiGbl_DeviceNotify.Handler, "Device Notifications"}, 110 {&AcpiGbl_TableHandler, "ACPI Table Events"}, 111 {&AcpiGbl_ExceptionHandler, "Control Method Exceptions"}, 112 {&AcpiGbl_InterfaceHandler, "OSI Invocations"} 113 }; 114 115 116 /******************************************************************************* 117 * 118 * FUNCTION: AcpiDbGetPointer 119 * 120 * PARAMETERS: Target - Pointer to string to be converted 121 * 122 * RETURN: Converted pointer 123 * 124 * DESCRIPTION: Convert an ascii pointer value to a real value 125 * 126 ******************************************************************************/ 127 128 static void * 129 AcpiDbGetPointer ( 130 void *Target) 131 { 132 void *ObjPtr; 133 134 135 ObjPtr = ACPI_TO_POINTER (ACPI_STRTOUL (Target, NULL, 16)); 136 return (ObjPtr); 137 } 138 139 140 /******************************************************************************* 141 * 142 * FUNCTION: AcpiDbDumpParserDescriptor 143 * 144 * PARAMETERS: Op - A parser Op descriptor 145 * 146 * RETURN: None 147 * 148 * DESCRIPTION: Display a formatted parser object 149 * 150 ******************************************************************************/ 151 152 static void 153 AcpiDbDumpParserDescriptor ( 154 ACPI_PARSE_OBJECT *Op) 155 { 156 const ACPI_OPCODE_INFO *Info; 157 158 159 Info = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 160 161 AcpiOsPrintf ("Parser Op Descriptor:\n"); 162 AcpiOsPrintf ("%20.20s : %4.4X\n", "Opcode", Op->Common.AmlOpcode); 163 164 ACPI_DEBUG_ONLY_MEMBERS (AcpiOsPrintf ("%20.20s : %s\n", "Opcode Name", 165 Info->Name)); 166 167 AcpiOsPrintf ("%20.20s : %p\n", "Value/ArgList", Op->Common.Value.Arg); 168 AcpiOsPrintf ("%20.20s : %p\n", "Parent", Op->Common.Parent); 169 AcpiOsPrintf ("%20.20s : %p\n", "NextOp", Op->Common.Next); 170 } 171 172 173 /******************************************************************************* 174 * 175 * FUNCTION: AcpiDbDecodeAndDisplayObject 176 * 177 * PARAMETERS: Target - String with object to be displayed. Names 178 * and hex pointers are supported. 179 * OutputType - Byte, Word, Dword, or Qword (B|W|D|Q) 180 * 181 * RETURN: None 182 * 183 * DESCRIPTION: Display a formatted ACPI object 184 * 185 ******************************************************************************/ 186 187 void 188 AcpiDbDecodeAndDisplayObject ( 189 char *Target, 190 char *OutputType) 191 { 192 void *ObjPtr; 193 ACPI_NAMESPACE_NODE *Node; 194 ACPI_OPERAND_OBJECT *ObjDesc; 195 UINT32 Display = DB_BYTE_DISPLAY; 196 char Buffer[80]; 197 ACPI_BUFFER RetBuf; 198 ACPI_STATUS Status; 199 UINT32 Size; 200 201 202 if (!Target) 203 { 204 return; 205 } 206 207 /* Decode the output type */ 208 209 if (OutputType) 210 { 211 AcpiUtStrupr (OutputType); 212 if (OutputType[0] == 'W') 213 { 214 Display = DB_WORD_DISPLAY; 215 } 216 else if (OutputType[0] == 'D') 217 { 218 Display = DB_DWORD_DISPLAY; 219 } 220 else if (OutputType[0] == 'Q') 221 { 222 Display = DB_QWORD_DISPLAY; 223 } 224 } 225 226 RetBuf.Length = sizeof (Buffer); 227 RetBuf.Pointer = Buffer; 228 229 /* Differentiate between a number and a name */ 230 231 if ((Target[0] >= 0x30) && (Target[0] <= 0x39)) 232 { 233 ObjPtr = AcpiDbGetPointer (Target); 234 if (!AcpiOsReadable (ObjPtr, 16)) 235 { 236 AcpiOsPrintf ("Address %p is invalid in this address space\n", 237 ObjPtr); 238 return; 239 } 240 241 /* Decode the object type */ 242 243 switch (ACPI_GET_DESCRIPTOR_TYPE (ObjPtr)) 244 { 245 case ACPI_DESC_TYPE_NAMED: 246 247 /* This is a namespace Node */ 248 249 if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_NAMESPACE_NODE))) 250 { 251 AcpiOsPrintf ( 252 "Cannot read entire Named object at address %p\n", ObjPtr); 253 return; 254 } 255 256 Node = ObjPtr; 257 goto DumpNode; 258 259 260 case ACPI_DESC_TYPE_OPERAND: 261 262 /* This is a ACPI OPERAND OBJECT */ 263 264 if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_OPERAND_OBJECT))) 265 { 266 AcpiOsPrintf ("Cannot read entire ACPI object at address %p\n", 267 ObjPtr); 268 return; 269 } 270 271 AcpiUtDumpBuffer (ObjPtr, sizeof (ACPI_OPERAND_OBJECT), Display, 272 ACPI_UINT32_MAX); 273 AcpiExDumpObjectDescriptor (ObjPtr, 1); 274 break; 275 276 277 case ACPI_DESC_TYPE_PARSER: 278 279 /* This is a Parser Op object */ 280 281 if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_PARSE_OBJECT))) 282 { 283 AcpiOsPrintf ( 284 "Cannot read entire Parser object at address %p\n", ObjPtr); 285 return; 286 } 287 288 AcpiUtDumpBuffer (ObjPtr, sizeof (ACPI_PARSE_OBJECT), Display, 289 ACPI_UINT32_MAX); 290 AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr); 291 break; 292 293 294 default: 295 296 /* Is not a recognizeable object */ 297 298 Size = 16; 299 if (AcpiOsReadable (ObjPtr, 64)) 300 { 301 Size = 64; 302 } 303 304 /* Just dump some memory */ 305 306 AcpiUtDumpBuffer (ObjPtr, Size, Display, ACPI_UINT32_MAX); 307 break; 308 } 309 310 return; 311 } 312 313 /* The parameter is a name string that must be resolved to a Named obj */ 314 315 Node = AcpiDbLocalNsLookup (Target); 316 if (!Node) 317 { 318 return; 319 } 320 321 322 DumpNode: 323 /* Now dump the NS node */ 324 325 Status = AcpiGetName (Node, ACPI_FULL_PATHNAME, &RetBuf); 326 if (ACPI_FAILURE (Status)) 327 { 328 AcpiOsPrintf ("Could not convert name to pathname\n"); 329 } 330 331 else 332 { 333 AcpiOsPrintf ("Object (%p) Pathname: %s\n", 334 Node, (char *) RetBuf.Pointer); 335 } 336 337 if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 338 { 339 AcpiOsPrintf ("Invalid Named object at address %p\n", Node); 340 return; 341 } 342 343 AcpiUtDumpBuffer ((void *) Node, sizeof (ACPI_NAMESPACE_NODE), 344 Display, ACPI_UINT32_MAX); 345 AcpiExDumpNamespaceNode (Node, 1); 346 347 ObjDesc = AcpiNsGetAttachedObject (Node); 348 if (ObjDesc) 349 { 350 AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc); 351 if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT))) 352 { 353 AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n", 354 ObjDesc); 355 return; 356 } 357 358 AcpiUtDumpBuffer ((void *) ObjDesc, sizeof (ACPI_OPERAND_OBJECT), 359 Display, ACPI_UINT32_MAX); 360 AcpiExDumpObjectDescriptor (ObjDesc, 1); 361 } 362 } 363 364 365 /******************************************************************************* 366 * 367 * FUNCTION: AcpiDbDisplayMethodInfo 368 * 369 * PARAMETERS: StartOp - Root of the control method parse tree 370 * 371 * RETURN: None 372 * 373 * DESCRIPTION: Display information about the current method 374 * 375 ******************************************************************************/ 376 377 void 378 AcpiDbDisplayMethodInfo ( 379 ACPI_PARSE_OBJECT *StartOp) 380 { 381 ACPI_WALK_STATE *WalkState; 382 ACPI_OPERAND_OBJECT *ObjDesc; 383 ACPI_NAMESPACE_NODE *Node; 384 ACPI_PARSE_OBJECT *RootOp; 385 ACPI_PARSE_OBJECT *Op; 386 const ACPI_OPCODE_INFO *OpInfo; 387 UINT32 NumOps = 0; 388 UINT32 NumOperands = 0; 389 UINT32 NumOperators = 0; 390 UINT32 NumRemainingOps = 0; 391 UINT32 NumRemainingOperands = 0; 392 UINT32 NumRemainingOperators = 0; 393 BOOLEAN CountRemaining = FALSE; 394 395 396 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 397 if (!WalkState) 398 { 399 AcpiOsPrintf ("There is no method currently executing\n"); 400 return; 401 } 402 403 ObjDesc = WalkState->MethodDesc; 404 Node = WalkState->MethodNode; 405 406 AcpiOsPrintf ("Currently executing control method is [%4.4s]\n", 407 AcpiUtGetNodeName (Node)); 408 AcpiOsPrintf ("%X Arguments, SyncLevel = %X\n", 409 (UINT32) ObjDesc->Method.ParamCount, 410 (UINT32) ObjDesc->Method.SyncLevel); 411 412 413 RootOp = StartOp; 414 while (RootOp->Common.Parent) 415 { 416 RootOp = RootOp->Common.Parent; 417 } 418 419 Op = RootOp; 420 421 while (Op) 422 { 423 if (Op == StartOp) 424 { 425 CountRemaining = TRUE; 426 } 427 428 NumOps++; 429 if (CountRemaining) 430 { 431 NumRemainingOps++; 432 } 433 434 /* Decode the opcode */ 435 436 OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 437 switch (OpInfo->Class) 438 { 439 case AML_CLASS_ARGUMENT: 440 if (CountRemaining) 441 { 442 NumRemainingOperands++; 443 } 444 445 NumOperands++; 446 break; 447 448 case AML_CLASS_UNKNOWN: 449 /* Bad opcode or ASCII character */ 450 451 continue; 452 453 default: 454 if (CountRemaining) 455 { 456 NumRemainingOperators++; 457 } 458 459 NumOperators++; 460 break; 461 } 462 463 Op = AcpiPsGetDepthNext (StartOp, Op); 464 } 465 466 AcpiOsPrintf ( 467 "Method contains: %X AML Opcodes - %X Operators, %X Operands\n", 468 NumOps, NumOperators, NumOperands); 469 470 AcpiOsPrintf ( 471 "Remaining to execute: %X AML Opcodes - %X Operators, %X Operands\n", 472 NumRemainingOps, NumRemainingOperators, NumRemainingOperands); 473 } 474 475 476 /******************************************************************************* 477 * 478 * FUNCTION: AcpiDbDisplayLocals 479 * 480 * PARAMETERS: None 481 * 482 * RETURN: None 483 * 484 * DESCRIPTION: Display all locals for the currently running control method 485 * 486 ******************************************************************************/ 487 488 void 489 AcpiDbDisplayLocals ( 490 void) 491 { 492 ACPI_WALK_STATE *WalkState; 493 494 495 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 496 if (!WalkState) 497 { 498 AcpiOsPrintf ("There is no method currently executing\n"); 499 return; 500 } 501 502 AcpiDmDisplayLocals (WalkState); 503 } 504 505 506 /******************************************************************************* 507 * 508 * FUNCTION: AcpiDbDisplayArguments 509 * 510 * PARAMETERS: None 511 * 512 * RETURN: None 513 * 514 * DESCRIPTION: Display all arguments for the currently running control method 515 * 516 ******************************************************************************/ 517 518 void 519 AcpiDbDisplayArguments ( 520 void) 521 { 522 ACPI_WALK_STATE *WalkState; 523 524 525 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 526 if (!WalkState) 527 { 528 AcpiOsPrintf ("There is no method currently executing\n"); 529 return; 530 } 531 532 AcpiDmDisplayArguments (WalkState); 533 } 534 535 536 /******************************************************************************* 537 * 538 * FUNCTION: AcpiDbDisplayResults 539 * 540 * PARAMETERS: None 541 * 542 * RETURN: None 543 * 544 * DESCRIPTION: Display current contents of a method result stack 545 * 546 ******************************************************************************/ 547 548 void 549 AcpiDbDisplayResults ( 550 void) 551 { 552 UINT32 i; 553 ACPI_WALK_STATE *WalkState; 554 ACPI_OPERAND_OBJECT *ObjDesc; 555 UINT32 ResultCount = 0; 556 ACPI_NAMESPACE_NODE *Node; 557 ACPI_GENERIC_STATE *Frame; 558 UINT32 Index; /* Index onto current frame */ 559 560 561 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 562 if (!WalkState) 563 { 564 AcpiOsPrintf ("There is no method currently executing\n"); 565 return; 566 } 567 568 ObjDesc = WalkState->MethodDesc; 569 Node = WalkState->MethodNode; 570 571 if (WalkState->Results) 572 { 573 ResultCount = WalkState->ResultCount; 574 } 575 576 AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n", 577 AcpiUtGetNodeName (Node), ResultCount); 578 579 /* From the top element of result stack */ 580 581 Frame = WalkState->Results; 582 Index = (ResultCount - 1) % ACPI_RESULTS_FRAME_OBJ_NUM; 583 584 for (i = 0; i < ResultCount; i++) 585 { 586 ObjDesc = Frame->Results.ObjDesc[Index]; 587 AcpiOsPrintf ("Result%u: ", i); 588 AcpiDmDisplayInternalObject (ObjDesc, WalkState); 589 if (Index == 0) 590 { 591 Frame = Frame->Results.Next; 592 Index = ACPI_RESULTS_FRAME_OBJ_NUM; 593 } 594 Index--; 595 } 596 } 597 598 599 /******************************************************************************* 600 * 601 * FUNCTION: AcpiDbDisplayCallingTree 602 * 603 * PARAMETERS: None 604 * 605 * RETURN: None 606 * 607 * DESCRIPTION: Display current calling tree of nested control methods 608 * 609 ******************************************************************************/ 610 611 void 612 AcpiDbDisplayCallingTree ( 613 void) 614 { 615 ACPI_WALK_STATE *WalkState; 616 ACPI_NAMESPACE_NODE *Node; 617 618 619 WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList); 620 if (!WalkState) 621 { 622 AcpiOsPrintf ("There is no method currently executing\n"); 623 return; 624 } 625 626 Node = WalkState->MethodNode; 627 AcpiOsPrintf ("Current Control Method Call Tree\n"); 628 629 while (WalkState) 630 { 631 Node = WalkState->MethodNode; 632 633 AcpiOsPrintf (" [%4.4s]\n", AcpiUtGetNodeName (Node)); 634 635 WalkState = WalkState->Next; 636 } 637 } 638 639 640 /******************************************************************************* 641 * 642 * FUNCTION: AcpiDbDisplayObjectType 643 * 644 * PARAMETERS: ObjectArg - User entered NS node handle 645 * 646 * RETURN: None 647 * 648 * DESCRIPTION: Display type of an arbitrary NS node 649 * 650 ******************************************************************************/ 651 652 void 653 AcpiDbDisplayObjectType ( 654 char *ObjectArg) 655 { 656 ACPI_HANDLE Handle; 657 ACPI_DEVICE_INFO *Info; 658 ACPI_STATUS Status; 659 UINT32 i; 660 661 662 Handle = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16)); 663 664 Status = AcpiGetObjectInfo (Handle, &Info); 665 if (ACPI_FAILURE (Status)) 666 { 667 AcpiOsPrintf ("Could not get object info, %s\n", 668 AcpiFormatException (Status)); 669 return; 670 } 671 672 AcpiOsPrintf ("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n", 673 ACPI_FORMAT_UINT64 (Info->Address), 674 Info->CurrentStatus, Info->Flags); 675 676 AcpiOsPrintf ("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n", 677 Info->HighestDstates[0], Info->HighestDstates[1], 678 Info->HighestDstates[2], Info->HighestDstates[3]); 679 680 AcpiOsPrintf ("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n", 681 Info->LowestDstates[0], Info->LowestDstates[1], 682 Info->LowestDstates[2], Info->LowestDstates[3], 683 Info->LowestDstates[4]); 684 685 if (Info->Valid & ACPI_VALID_HID) 686 { 687 AcpiOsPrintf ("HID: %s\n", Info->HardwareId.String); 688 } 689 if (Info->Valid & ACPI_VALID_UID) 690 { 691 AcpiOsPrintf ("UID: %s\n", Info->UniqueId.String); 692 } 693 if (Info->Valid & ACPI_VALID_CID) 694 { 695 for (i = 0; i < Info->CompatibleIdList.Count; i++) 696 { 697 AcpiOsPrintf ("CID %u: %s\n", i, 698 Info->CompatibleIdList.Ids[i].String); 699 } 700 } 701 702 ACPI_FREE (Info); 703 } 704 705 706 /******************************************************************************* 707 * 708 * FUNCTION: AcpiDbDisplayResultObject 709 * 710 * PARAMETERS: ObjDesc - Object to be displayed 711 * WalkState - Current walk state 712 * 713 * RETURN: None 714 * 715 * DESCRIPTION: Display the result of an AML opcode 716 * 717 * Note: Curently only displays the result object if we are single stepping. 718 * However, this output may be useful in other contexts and could be enabled 719 * to do so if needed. 720 * 721 ******************************************************************************/ 722 723 void 724 AcpiDbDisplayResultObject ( 725 ACPI_OPERAND_OBJECT *ObjDesc, 726 ACPI_WALK_STATE *WalkState) 727 { 728 729 /* Only display if single stepping */ 730 731 if (!AcpiGbl_CmSingleStep) 732 { 733 return; 734 } 735 736 AcpiOsPrintf ("ResultObj: "); 737 AcpiDmDisplayInternalObject (ObjDesc, WalkState); 738 AcpiOsPrintf ("\n"); 739 } 740 741 742 /******************************************************************************* 743 * 744 * FUNCTION: AcpiDbDisplayArgumentObject 745 * 746 * PARAMETERS: ObjDesc - Object to be displayed 747 * WalkState - Current walk state 748 * 749 * RETURN: None 750 * 751 * DESCRIPTION: Display the result of an AML opcode 752 * 753 ******************************************************************************/ 754 755 void 756 AcpiDbDisplayArgumentObject ( 757 ACPI_OPERAND_OBJECT *ObjDesc, 758 ACPI_WALK_STATE *WalkState) 759 { 760 761 if (!AcpiGbl_CmSingleStep) 762 { 763 return; 764 } 765 766 AcpiOsPrintf ("ArgObj: "); 767 AcpiDmDisplayInternalObject (ObjDesc, WalkState); 768 } 769 770 771 /******************************************************************************* 772 * 773 * FUNCTION: AcpiDbDisplayGpes 774 * 775 * PARAMETERS: None 776 * 777 * RETURN: None 778 * 779 * DESCRIPTION: Display the current GPE structures 780 * 781 ******************************************************************************/ 782 783 void 784 AcpiDbDisplayGpes ( 785 void) 786 { 787 ACPI_GPE_BLOCK_INFO *GpeBlock; 788 ACPI_GPE_XRUPT_INFO *GpeXruptInfo; 789 ACPI_GPE_EVENT_INFO *GpeEventInfo; 790 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 791 char *GpeType; 792 UINT32 GpeIndex; 793 UINT32 Block = 0; 794 UINT32 i; 795 UINT32 j; 796 char Buffer[80]; 797 ACPI_BUFFER RetBuf; 798 ACPI_STATUS Status; 799 800 801 RetBuf.Length = sizeof (Buffer); 802 RetBuf.Pointer = Buffer; 803 804 Block = 0; 805 806 /* Walk the GPE lists */ 807 808 GpeXruptInfo = AcpiGbl_GpeXruptListHead; 809 while (GpeXruptInfo) 810 { 811 GpeBlock = GpeXruptInfo->GpeBlockListHead; 812 while (GpeBlock) 813 { 814 Status = AcpiGetName (GpeBlock->Node, ACPI_FULL_PATHNAME, &RetBuf); 815 if (ACPI_FAILURE (Status)) 816 { 817 AcpiOsPrintf ("Could not convert name to pathname\n"); 818 } 819 820 if (GpeBlock->Node == AcpiGbl_FadtGpeDevice) 821 { 822 GpeType = "FADT-defined GPE block"; 823 } 824 else 825 { 826 GpeType = "GPE Block Device"; 827 } 828 829 AcpiOsPrintf ("\nBlock %u - Info %p DeviceNode %p [%s] - %s\n", 830 Block, GpeBlock, GpeBlock->Node, Buffer, GpeType); 831 832 AcpiOsPrintf (" Registers: %u (%u GPEs)\n", 833 GpeBlock->RegisterCount, GpeBlock->GpeCount); 834 835 AcpiOsPrintf (" GPE range: 0x%X to 0x%X on interrupt %u\n", 836 GpeBlock->BlockBaseNumber, 837 GpeBlock->BlockBaseNumber + (GpeBlock->GpeCount - 1), 838 GpeXruptInfo->InterruptNumber); 839 840 AcpiOsPrintf ( 841 " RegisterInfo: %p Status %8.8X%8.8X Enable %8.8X%8.8X\n", 842 GpeBlock->RegisterInfo, 843 ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->StatusAddress.Address), 844 ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->EnableAddress.Address)); 845 846 AcpiOsPrintf (" EventInfo: %p\n", GpeBlock->EventInfo); 847 848 /* Examine each GPE Register within the block */ 849 850 for (i = 0; i < GpeBlock->RegisterCount; i++) 851 { 852 GpeRegisterInfo = &GpeBlock->RegisterInfo[i]; 853 854 AcpiOsPrintf ( 855 " Reg %u: (GPE %.2X-%.2X) RunEnable %2.2X WakeEnable %2.2X" 856 " Status %8.8X%8.8X Enable %8.8X%8.8X\n", 857 i, GpeRegisterInfo->BaseGpeNumber, 858 GpeRegisterInfo->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH - 1), 859 GpeRegisterInfo->EnableForRun, 860 GpeRegisterInfo->EnableForWake, 861 ACPI_FORMAT_UINT64 (GpeRegisterInfo->StatusAddress.Address), 862 ACPI_FORMAT_UINT64 (GpeRegisterInfo->EnableAddress.Address)); 863 864 /* Now look at the individual GPEs in this byte register */ 865 866 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) 867 { 868 GpeIndex = (i * ACPI_GPE_REGISTER_WIDTH) + j; 869 GpeEventInfo = &GpeBlock->EventInfo[GpeIndex]; 870 871 if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == 872 ACPI_GPE_DISPATCH_NONE) 873 { 874 /* This GPE is not used (no method or handler), ignore it */ 875 876 continue; 877 } 878 879 AcpiOsPrintf ( 880 " GPE %.2X: %p RunRefs %2.2X Flags %2.2X (", 881 GpeBlock->BlockBaseNumber + GpeIndex, GpeEventInfo, 882 GpeEventInfo->RuntimeCount, GpeEventInfo->Flags); 883 884 /* Decode the flags byte */ 885 886 if (GpeEventInfo->Flags & ACPI_GPE_LEVEL_TRIGGERED) 887 { 888 AcpiOsPrintf ("Level, "); 889 } 890 else 891 { 892 AcpiOsPrintf ("Edge, "); 893 } 894 895 if (GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE) 896 { 897 AcpiOsPrintf ("CanWake, "); 898 } 899 else 900 { 901 AcpiOsPrintf ("RunOnly, "); 902 } 903 904 switch (GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) 905 { 906 case ACPI_GPE_DISPATCH_NONE: 907 AcpiOsPrintf ("NotUsed"); 908 break; 909 case ACPI_GPE_DISPATCH_METHOD: 910 AcpiOsPrintf ("Method"); 911 break; 912 case ACPI_GPE_DISPATCH_HANDLER: 913 AcpiOsPrintf ("Handler"); 914 break; 915 case ACPI_GPE_DISPATCH_NOTIFY: 916 AcpiOsPrintf ("Notify"); 917 break; 918 default: 919 AcpiOsPrintf ("UNKNOWN: %X", 920 GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK); 921 break; 922 } 923 924 AcpiOsPrintf (")\n"); 925 } 926 } 927 Block++; 928 GpeBlock = GpeBlock->Next; 929 } 930 GpeXruptInfo = GpeXruptInfo->Next; 931 } 932 } 933 934 935 /******************************************************************************* 936 * 937 * FUNCTION: AcpiDbDisplayHandlers 938 * 939 * PARAMETERS: None 940 * 941 * RETURN: None 942 * 943 * DESCRIPTION: Display the currently installed global handlers 944 * 945 ******************************************************************************/ 946 947 void 948 AcpiDbDisplayHandlers ( 949 void) 950 { 951 ACPI_OPERAND_OBJECT *ObjDesc; 952 ACPI_OPERAND_OBJECT *HandlerObj; 953 ACPI_ADR_SPACE_TYPE SpaceId; 954 UINT32 i; 955 956 957 /* Operation region handlers */ 958 959 AcpiOsPrintf ("\nOperation Region Handlers:\n"); 960 961 ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode); 962 if (ObjDesc) 963 { 964 for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_SpaceIdList); i++) 965 { 966 SpaceId = AcpiGbl_SpaceIdList[i]; 967 HandlerObj = ObjDesc->Device.Handler; 968 969 AcpiOsPrintf (ACPI_PREDEFINED_PREFIX, 970 AcpiUtGetRegionName ((UINT8) SpaceId), SpaceId); 971 972 while (HandlerObj) 973 { 974 if (i == HandlerObj->AddressSpace.SpaceId) 975 { 976 AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, 977 (HandlerObj->AddressSpace.HandlerFlags & 978 ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User", 979 HandlerObj->AddressSpace.Handler); 980 goto FoundHandler; 981 } 982 983 HandlerObj = HandlerObj->AddressSpace.Next; 984 } 985 986 /* There is no handler for this SpaceId */ 987 988 AcpiOsPrintf ("None\n"); 989 990 FoundHandler:; 991 } 992 } 993 994 /* Fixed event handlers */ 995 996 AcpiOsPrintf ("\nFixed Event Handlers:\n"); 997 998 for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) 999 { 1000 AcpiOsPrintf (ACPI_PREDEFINED_PREFIX, AcpiUtGetEventName (i), i); 1001 if (AcpiGbl_FixedEventHandlers[i].Handler) 1002 { 1003 AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User", 1004 AcpiGbl_FixedEventHandlers[i].Handler); 1005 } 1006 else 1007 { 1008 AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None"); 1009 } 1010 } 1011 1012 /* Miscellaneous global handlers */ 1013 1014 AcpiOsPrintf ("\nMiscellaneous Global Handlers:\n"); 1015 1016 for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_HandlerList); i++) 1017 { 1018 AcpiOsPrintf (ACPI_HANDLER_NAME_STRING, AcpiGbl_HandlerList[i].Name); 1019 if (AcpiGbl_HandlerList[i].Handler) 1020 { 1021 AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User", 1022 AcpiGbl_HandlerList[i].Handler); 1023 } 1024 else 1025 { 1026 AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None"); 1027 } 1028 } 1029 } 1030 1031 #endif /* ACPI_DEBUGGER */