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