167754Smsmith/*******************************************************************************
267754Smsmith *
367754Smsmith * Module Name: dbdisply - debug display commands
467754Smsmith *
567754Smsmith ******************************************************************************/
667754Smsmith
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
47193341Sjkim#include <contrib/dev/acpica/include/acdispat.h>
48193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49193341Sjkim#include <contrib/dev/acpica/include/acparser.h>
50193341Sjkim#include <contrib/dev/acpica/include/acinterp.h>
51193341Sjkim#include <contrib/dev/acpica/include/acdebug.h>
52193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
5367754Smsmith
5467754Smsmith
55102550Siwasaki#ifdef ACPI_DEBUGGER
5667754Smsmith
57102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
5891116Smsmith        ACPI_MODULE_NAME    ("dbdisply")
5967754Smsmith
60151937Sjkim/* Local prototypes */
6167754Smsmith
62151937Sjkimstatic void
63151937SjkimAcpiDbDumpParserDescriptor (
64151937Sjkim    ACPI_PARSE_OBJECT       *Op);
65151937Sjkim
66151937Sjkimstatic void *
67151937SjkimAcpiDbGetPointer (
68151937Sjkim    void                    *Target);
69151937Sjkim
70249663Sjkimstatic ACPI_STATUS
71249663SjkimAcpiDbDisplayNonRootHandlers (
72249663Sjkim    ACPI_HANDLE             ObjHandle,
73249663Sjkim    UINT32                  NestingLevel,
74249663Sjkim    void                    *Context,
75249663Sjkim    void                    **ReturnValue);
76151937Sjkim
77220663Sjkim/*
78220663Sjkim * System handler information.
79220663Sjkim * Used for Handlers command, in AcpiDbDisplayHandlers.
80220663Sjkim */
81220663Sjkim#define ACPI_PREDEFINED_PREFIX          "%25s (%.2X) : "
82220663Sjkim#define ACPI_HANDLER_NAME_STRING               "%30s : "
83220663Sjkim#define ACPI_HANDLER_PRESENT_STRING                    "%-9s (%p)\n"
84249663Sjkim#define ACPI_HANDLER_PRESENT_STRING2                   "%-9s (%p)"
85220663Sjkim#define ACPI_HANDLER_NOT_PRESENT_STRING                "%-9s\n"
86220663Sjkim
87220663Sjkim/* All predefined Address Space IDs */
88220663Sjkim
89220663Sjkimstatic ACPI_ADR_SPACE_TYPE  AcpiGbl_SpaceIdList[] =
90220663Sjkim{
91220663Sjkim    ACPI_ADR_SPACE_SYSTEM_MEMORY,
92220663Sjkim    ACPI_ADR_SPACE_SYSTEM_IO,
93220663Sjkim    ACPI_ADR_SPACE_PCI_CONFIG,
94220663Sjkim    ACPI_ADR_SPACE_EC,
95220663Sjkim    ACPI_ADR_SPACE_SMBUS,
96220663Sjkim    ACPI_ADR_SPACE_CMOS,
97220663Sjkim    ACPI_ADR_SPACE_PCI_BAR_TARGET,
98220663Sjkim    ACPI_ADR_SPACE_IPMI,
99228110Sjkim    ACPI_ADR_SPACE_GPIO,
100228110Sjkim    ACPI_ADR_SPACE_GSBUS,
101220663Sjkim    ACPI_ADR_SPACE_DATA_TABLE,
102220663Sjkim    ACPI_ADR_SPACE_FIXED_HARDWARE
103220663Sjkim};
104220663Sjkim
105220663Sjkim/* Global handler information */
106220663Sjkim
107220663Sjkimtypedef struct acpi_handler_info
108220663Sjkim{
109220663Sjkim    void                    *Handler;
110220663Sjkim    char                    *Name;
111220663Sjkim
112220663Sjkim} ACPI_HANDLER_INFO;
113220663Sjkim
114220663Sjkimstatic ACPI_HANDLER_INFO    AcpiGbl_HandlerList[] =
115220663Sjkim{
116234623Sjkim    {&AcpiGbl_GlobalNotify[0].Handler,  "System Notifications"},
117234623Sjkim    {&AcpiGbl_GlobalNotify[1].Handler,  "Device Notifications"},
118220663Sjkim    {&AcpiGbl_TableHandler,             "ACPI Table Events"},
119220663Sjkim    {&AcpiGbl_ExceptionHandler,         "Control Method Exceptions"},
120220663Sjkim    {&AcpiGbl_InterfaceHandler,         "OSI Invocations"}
121220663Sjkim};
122220663Sjkim
123220663Sjkim
124151937Sjkim/*******************************************************************************
12567754Smsmith *
12667754Smsmith * FUNCTION:    AcpiDbGetPointer
12767754Smsmith *
12867754Smsmith * PARAMETERS:  Target          - Pointer to string to be converted
12967754Smsmith *
13067754Smsmith * RETURN:      Converted pointer
13167754Smsmith *
13267754Smsmith * DESCRIPTION: Convert an ascii pointer value to a real value
13367754Smsmith *
134151937Sjkim ******************************************************************************/
13567754Smsmith
136151937Sjkimstatic void *
13767754SmsmithAcpiDbGetPointer (
13867754Smsmith    void                    *Target)
13967754Smsmith{
14067754Smsmith    void                    *ObjPtr;
141252279Sjkim    ACPI_SIZE               Address;
14267754Smsmith
14367754Smsmith
144252279Sjkim    Address = ACPI_STRTOUL (Target, NULL, 16);
145252279Sjkim    ObjPtr = ACPI_TO_POINTER (Address);
14667754Smsmith    return (ObjPtr);
14767754Smsmith}
14867754Smsmith
14967754Smsmith
15067754Smsmith/*******************************************************************************
15167754Smsmith *
15267754Smsmith * FUNCTION:    AcpiDbDumpParserDescriptor
15367754Smsmith *
15467754Smsmith * PARAMETERS:  Op              - A parser Op descriptor
15567754Smsmith *
15667754Smsmith * RETURN:      None
15767754Smsmith *
15867754Smsmith * DESCRIPTION: Display a formatted parser object
15967754Smsmith *
16067754Smsmith ******************************************************************************/
16167754Smsmith
162151937Sjkimstatic void
16367754SmsmithAcpiDbDumpParserDescriptor (
16467754Smsmith    ACPI_PARSE_OBJECT       *Op)
16567754Smsmith{
16683174Smsmith    const ACPI_OPCODE_INFO  *Info;
16767754Smsmith
16867754Smsmith
16999679Siwasaki    Info = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
17067754Smsmith
17167754Smsmith    AcpiOsPrintf ("Parser Op Descriptor:\n");
17299679Siwasaki    AcpiOsPrintf ("%20.20s : %4.4X\n", "Opcode", Op->Common.AmlOpcode);
17367754Smsmith
174151937Sjkim    ACPI_DEBUG_ONLY_MEMBERS (AcpiOsPrintf ("%20.20s : %s\n", "Opcode Name",
175151937Sjkim        Info->Name));
17667754Smsmith
17799679Siwasaki    AcpiOsPrintf ("%20.20s : %p\n", "Value/ArgList", Op->Common.Value.Arg);
17899679Siwasaki    AcpiOsPrintf ("%20.20s : %p\n", "Parent", Op->Common.Parent);
17999679Siwasaki    AcpiOsPrintf ("%20.20s : %p\n", "NextOp", Op->Common.Next);
18067754Smsmith}
18167754Smsmith
18267754Smsmith
18367754Smsmith/*******************************************************************************
18467754Smsmith *
18567754Smsmith * FUNCTION:    AcpiDbDecodeAndDisplayObject
18667754Smsmith *
187241973Sjkim * PARAMETERS:  Target          - String with object to be displayed. Names
18867754Smsmith *                                and hex pointers are supported.
18967754Smsmith *              OutputType      - Byte, Word, Dword, or Qword (B|W|D|Q)
19067754Smsmith *
19167754Smsmith * RETURN:      None
19267754Smsmith *
19367754Smsmith * DESCRIPTION: Display a formatted ACPI object
19467754Smsmith *
19567754Smsmith ******************************************************************************/
19667754Smsmith
19767754Smsmithvoid
19867754SmsmithAcpiDbDecodeAndDisplayObject (
199114237Snjl    char                    *Target,
200114237Snjl    char                    *OutputType)
20167754Smsmith{
20267754Smsmith    void                    *ObjPtr;
20367754Smsmith    ACPI_NAMESPACE_NODE     *Node;
20487031Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
20567754Smsmith    UINT32                  Display = DB_BYTE_DISPLAY;
206114237Snjl    char                    Buffer[80];
20767754Smsmith    ACPI_BUFFER             RetBuf;
20867754Smsmith    ACPI_STATUS             Status;
20967754Smsmith    UINT32                  Size;
21067754Smsmith
21167754Smsmith
21267754Smsmith    if (!Target)
21367754Smsmith    {
21467754Smsmith        return;
21567754Smsmith    }
21667754Smsmith
21767754Smsmith    /* Decode the output type */
21867754Smsmith
21967754Smsmith    if (OutputType)
22067754Smsmith    {
221151937Sjkim        AcpiUtStrupr (OutputType);
22267754Smsmith        if (OutputType[0] == 'W')
22367754Smsmith        {
22467754Smsmith            Display = DB_WORD_DISPLAY;
22567754Smsmith        }
22667754Smsmith        else if (OutputType[0] == 'D')
22767754Smsmith        {
22867754Smsmith            Display = DB_DWORD_DISPLAY;
22967754Smsmith        }
23067754Smsmith        else if (OutputType[0] == 'Q')
23167754Smsmith        {
23267754Smsmith            Display = DB_QWORD_DISPLAY;
23367754Smsmith        }
23467754Smsmith    }
23567754Smsmith
23667754Smsmith    RetBuf.Length = sizeof (Buffer);
23767754Smsmith    RetBuf.Pointer = Buffer;
23867754Smsmith
23967754Smsmith    /* Differentiate between a number and a name */
24067754Smsmith
24167754Smsmith    if ((Target[0] >= 0x30) && (Target[0] <= 0x39))
24267754Smsmith    {
24367754Smsmith        ObjPtr = AcpiDbGetPointer (Target);
24467754Smsmith        if (!AcpiOsReadable (ObjPtr, 16))
24567754Smsmith        {
246151937Sjkim            AcpiOsPrintf ("Address %p is invalid in this address space\n",
247151937Sjkim                ObjPtr);
24867754Smsmith            return;
24967754Smsmith        }
25067754Smsmith
25167754Smsmith        /* Decode the object type */
25267754Smsmith
25391116Smsmith        switch (ACPI_GET_DESCRIPTOR_TYPE (ObjPtr))
25467754Smsmith        {
25591116Smsmith        case ACPI_DESC_TYPE_NAMED:
25667754Smsmith
25791116Smsmith            /* This is a namespace Node */
25891116Smsmith
25967754Smsmith            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_NAMESPACE_NODE)))
26067754Smsmith            {
261151937Sjkim                AcpiOsPrintf (
262151937Sjkim                    "Cannot read entire Named object at address %p\n", ObjPtr);
26367754Smsmith                return;
26467754Smsmith            }
26567754Smsmith
26667754Smsmith            Node = ObjPtr;
267151937Sjkim            goto DumpNode;
26867754Smsmith
26999679Siwasaki        case ACPI_DESC_TYPE_OPERAND:
27091116Smsmith
27191116Smsmith            /* This is a ACPI OPERAND OBJECT */
27291116Smsmith
27367754Smsmith            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_OPERAND_OBJECT)))
27467754Smsmith            {
275151937Sjkim                AcpiOsPrintf ("Cannot read entire ACPI object at address %p\n",
276151937Sjkim                    ObjPtr);
27767754Smsmith                return;
27867754Smsmith            }
27967754Smsmith
280241973Sjkim            AcpiUtDebugDumpBuffer (ObjPtr, sizeof (ACPI_OPERAND_OBJECT), Display,
281151937Sjkim                ACPI_UINT32_MAX);
28277424Smsmith            AcpiExDumpObjectDescriptor (ObjPtr, 1);
28391116Smsmith            break;
28467754Smsmith
28591116Smsmith        case ACPI_DESC_TYPE_PARSER:
28691116Smsmith
28791116Smsmith            /* This is a Parser Op object */
28891116Smsmith
28967754Smsmith            if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_PARSE_OBJECT)))
29067754Smsmith            {
291151937Sjkim                AcpiOsPrintf (
292151937Sjkim                    "Cannot read entire Parser object at address %p\n", ObjPtr);
29367754Smsmith                return;
29467754Smsmith            }
29567754Smsmith
296241973Sjkim            AcpiUtDebugDumpBuffer (ObjPtr, sizeof (ACPI_PARSE_OBJECT), Display,
297151937Sjkim                ACPI_UINT32_MAX);
29867754Smsmith            AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr);
29991116Smsmith            break;
30067754Smsmith
30191116Smsmith        default:
30291116Smsmith
30391116Smsmith            /* Is not a recognizeable object */
30491116Smsmith
305281075Sdim            AcpiOsPrintf (
306281075Sdim                "Not a known ACPI internal object, descriptor type %2.2X\n",
307281075Sdim                ACPI_GET_DESCRIPTOR_TYPE (ObjPtr));
308281075Sdim
30967754Smsmith            Size = 16;
31067754Smsmith            if (AcpiOsReadable (ObjPtr, 64))
31167754Smsmith            {
31267754Smsmith                Size = 64;
31367754Smsmith            }
31467754Smsmith
31567754Smsmith            /* Just dump some memory */
31667754Smsmith
317241973Sjkim            AcpiUtDebugDumpBuffer (ObjPtr, Size, Display, ACPI_UINT32_MAX);
31891116Smsmith            break;
31967754Smsmith        }
32067754Smsmith
32167754Smsmith        return;
32267754Smsmith    }
32367754Smsmith
32467754Smsmith    /* The parameter is a name string that must be resolved to a Named obj */
32567754Smsmith
32667754Smsmith    Node = AcpiDbLocalNsLookup (Target);
32767754Smsmith    if (!Node)
32867754Smsmith    {
32967754Smsmith        return;
33067754Smsmith    }
33167754Smsmith
33267754Smsmith
333151937SjkimDumpNode:
334151937Sjkim    /* Now dump the NS node */
33567754Smsmith
33667754Smsmith    Status = AcpiGetName (Node, ACPI_FULL_PATHNAME, &RetBuf);
33767754Smsmith    if (ACPI_FAILURE (Status))
33867754Smsmith    {
33967754Smsmith        AcpiOsPrintf ("Could not convert name to pathname\n");
34067754Smsmith    }
34167754Smsmith
34269746Smsmith    else
34369746Smsmith    {
344151937Sjkim        AcpiOsPrintf ("Object (%p) Pathname:  %s\n",
345151937Sjkim            Node, (char *) RetBuf.Pointer);
34669746Smsmith    }
34769746Smsmith
34867754Smsmith    if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
34967754Smsmith    {
35067754Smsmith        AcpiOsPrintf ("Invalid Named object at address %p\n", Node);
35167754Smsmith        return;
35267754Smsmith    }
35367754Smsmith
354241973Sjkim    AcpiUtDebugDumpBuffer ((void *) Node, sizeof (ACPI_NAMESPACE_NODE),
355151937Sjkim        Display, ACPI_UINT32_MAX);
356167802Sjkim    AcpiExDumpNamespaceNode (Node, 1);
35767754Smsmith
35887031Smsmith    ObjDesc = AcpiNsGetAttachedObject (Node);
35987031Smsmith    if (ObjDesc)
36067754Smsmith    {
36187031Smsmith        AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
36287031Smsmith        if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
36367754Smsmith        {
364151937Sjkim            AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
365151937Sjkim                ObjDesc);
36667754Smsmith            return;
36767754Smsmith        }
36867754Smsmith
369241973Sjkim        AcpiUtDebugDumpBuffer ((void *) ObjDesc, sizeof (ACPI_OPERAND_OBJECT),
370151937Sjkim            Display, ACPI_UINT32_MAX);
37187031Smsmith        AcpiExDumpObjectDescriptor (ObjDesc, 1);
37267754Smsmith    }
37367754Smsmith}
37467754Smsmith
37567754Smsmith
37667754Smsmith/*******************************************************************************
37767754Smsmith *
37867754Smsmith * FUNCTION:    AcpiDbDisplayMethodInfo
37967754Smsmith *
38067754Smsmith * PARAMETERS:  StartOp         - Root of the control method parse tree
38167754Smsmith *
38267754Smsmith * RETURN:      None
38367754Smsmith *
38467754Smsmith * DESCRIPTION: Display information about the current method
38567754Smsmith *
38667754Smsmith ******************************************************************************/
38767754Smsmith
38867754Smsmithvoid
38967754SmsmithAcpiDbDisplayMethodInfo (
39067754Smsmith    ACPI_PARSE_OBJECT       *StartOp)
39167754Smsmith{
39267754Smsmith    ACPI_WALK_STATE         *WalkState;
39367754Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
39467754Smsmith    ACPI_NAMESPACE_NODE     *Node;
39567754Smsmith    ACPI_PARSE_OBJECT       *RootOp;
39667754Smsmith    ACPI_PARSE_OBJECT       *Op;
39783174Smsmith    const ACPI_OPCODE_INFO  *OpInfo;
39867754Smsmith    UINT32                  NumOps = 0;
39967754Smsmith    UINT32                  NumOperands = 0;
40067754Smsmith    UINT32                  NumOperators = 0;
40167754Smsmith    UINT32                  NumRemainingOps = 0;
40267754Smsmith    UINT32                  NumRemainingOperands = 0;
40367754Smsmith    UINT32                  NumRemainingOperators = 0;
40467754Smsmith    BOOLEAN                 CountRemaining = FALSE;
40567754Smsmith
40667754Smsmith
40767754Smsmith    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
40867754Smsmith    if (!WalkState)
40967754Smsmith    {
41067754Smsmith        AcpiOsPrintf ("There is no method currently executing\n");
41167754Smsmith        return;
41267754Smsmith    }
41367754Smsmith
41467754Smsmith    ObjDesc = WalkState->MethodDesc;
41587031Smsmith    Node    = WalkState->MethodNode;
41667754Smsmith
417123315Snjl    AcpiOsPrintf ("Currently executing control method is [%4.4s]\n",
418123315Snjl            AcpiUtGetNodeName (Node));
419167802Sjkim    AcpiOsPrintf ("%X Arguments, SyncLevel = %X\n",
420167802Sjkim            (UINT32) ObjDesc->Method.ParamCount,
421167802Sjkim            (UINT32) ObjDesc->Method.SyncLevel);
42267754Smsmith
42367754Smsmith
42467754Smsmith    RootOp = StartOp;
42599679Siwasaki    while (RootOp->Common.Parent)
42667754Smsmith    {
42799679Siwasaki        RootOp = RootOp->Common.Parent;
42867754Smsmith    }
42967754Smsmith
43067754Smsmith    Op = RootOp;
43167754Smsmith
43267754Smsmith    while (Op)
43367754Smsmith    {
43467754Smsmith        if (Op == StartOp)
43567754Smsmith        {
43667754Smsmith            CountRemaining = TRUE;
43767754Smsmith        }
43867754Smsmith
43967754Smsmith        NumOps++;
44067754Smsmith        if (CountRemaining)
44167754Smsmith        {
44267754Smsmith            NumRemainingOps++;
44367754Smsmith        }
44467754Smsmith
44567754Smsmith        /* Decode the opcode */
44667754Smsmith
44799679Siwasaki        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
44885756Smsmith        switch (OpInfo->Class)
44967754Smsmith        {
45085756Smsmith        case AML_CLASS_ARGUMENT:
451250838Sjkim
45267754Smsmith            if (CountRemaining)
45367754Smsmith            {
45467754Smsmith                NumRemainingOperands++;
45567754Smsmith            }
45667754Smsmith
45767754Smsmith            NumOperands++;
45867754Smsmith            break;
45967754Smsmith
46085756Smsmith        case AML_CLASS_UNKNOWN:
461250838Sjkim
46285756Smsmith            /* Bad opcode or ASCII character */
46385756Smsmith
46485756Smsmith            continue;
46585756Smsmith
46667754Smsmith        default:
467250838Sjkim
46867754Smsmith            if (CountRemaining)
46967754Smsmith            {
47067754Smsmith                NumRemainingOperators++;
47167754Smsmith            }
47267754Smsmith
47367754Smsmith            NumOperators++;
47467754Smsmith            break;
47567754Smsmith        }
47667754Smsmith
47767754Smsmith        Op = AcpiPsGetDepthNext (StartOp, Op);
47867754Smsmith    }
47967754Smsmith
480151937Sjkim    AcpiOsPrintf (
481151937Sjkim        "Method contains:       %X AML Opcodes - %X Operators, %X Operands\n",
482151937Sjkim        NumOps, NumOperators, NumOperands);
48367754Smsmith
484151937Sjkim    AcpiOsPrintf (
485151937Sjkim        "Remaining to execute:  %X AML Opcodes - %X Operators, %X Operands\n",
486151937Sjkim        NumRemainingOps, NumRemainingOperators, NumRemainingOperands);
48767754Smsmith}
48867754Smsmith
48967754Smsmith
49067754Smsmith/*******************************************************************************
49167754Smsmith *
49267754Smsmith * FUNCTION:    AcpiDbDisplayLocals
49367754Smsmith *
49467754Smsmith * PARAMETERS:  None
49567754Smsmith *
49667754Smsmith * RETURN:      None
49767754Smsmith *
49867754Smsmith * DESCRIPTION: Display all locals for the currently running control method
49967754Smsmith *
50067754Smsmith ******************************************************************************/
50167754Smsmith
50267754Smsmithvoid
503151937SjkimAcpiDbDisplayLocals (
504151937Sjkim    void)
50567754Smsmith{
50667754Smsmith    ACPI_WALK_STATE         *WalkState;
50767754Smsmith
50867754Smsmith
50967754Smsmith    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
51067754Smsmith    if (!WalkState)
51167754Smsmith    {
51267754Smsmith        AcpiOsPrintf ("There is no method currently executing\n");
51367754Smsmith        return;
51467754Smsmith    }
51567754Smsmith
516117521Snjl    AcpiDmDisplayLocals (WalkState);
51767754Smsmith}
51867754Smsmith
51967754Smsmith
52067754Smsmith/*******************************************************************************
52167754Smsmith *
52267754Smsmith * FUNCTION:    AcpiDbDisplayArguments
52367754Smsmith *
52467754Smsmith * PARAMETERS:  None
52567754Smsmith *
52667754Smsmith * RETURN:      None
52767754Smsmith *
52867754Smsmith * DESCRIPTION: Display all arguments for the currently running control method
52967754Smsmith *
53067754Smsmith ******************************************************************************/
53167754Smsmith
53267754Smsmithvoid
533151937SjkimAcpiDbDisplayArguments (
534151937Sjkim    void)
53567754Smsmith{
53667754Smsmith    ACPI_WALK_STATE         *WalkState;
53767754Smsmith
53867754Smsmith
53967754Smsmith    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
54067754Smsmith    if (!WalkState)
54167754Smsmith    {
54267754Smsmith        AcpiOsPrintf ("There is no method currently executing\n");
54367754Smsmith        return;
54467754Smsmith    }
54567754Smsmith
546117521Snjl    AcpiDmDisplayArguments (WalkState);
54767754Smsmith}
54867754Smsmith
54967754Smsmith
55067754Smsmith/*******************************************************************************
55167754Smsmith *
55267754Smsmith * FUNCTION:    AcpiDbDisplayResults
55367754Smsmith *
55467754Smsmith * PARAMETERS:  None
55567754Smsmith *
55667754Smsmith * RETURN:      None
55767754Smsmith *
55867754Smsmith * DESCRIPTION: Display current contents of a method result stack
55967754Smsmith *
56067754Smsmith ******************************************************************************/
56167754Smsmith
56267754Smsmithvoid
563151937SjkimAcpiDbDisplayResults (
564151937Sjkim    void)
56567754Smsmith{
56667754Smsmith    UINT32                  i;
56767754Smsmith    ACPI_WALK_STATE         *WalkState;
56867754Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
569167802Sjkim    UINT32                  ResultCount = 0;
57067754Smsmith    ACPI_NAMESPACE_NODE     *Node;
571167802Sjkim    ACPI_GENERIC_STATE      *Frame;
572167802Sjkim    UINT32                  Index; /* Index onto current frame */
57367754Smsmith
57467754Smsmith
57567754Smsmith    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
57667754Smsmith    if (!WalkState)
57767754Smsmith    {
57867754Smsmith        AcpiOsPrintf ("There is no method currently executing\n");
57967754Smsmith        return;
58067754Smsmith    }
58167754Smsmith
58267754Smsmith    ObjDesc = WalkState->MethodDesc;
583123315Snjl    Node    = WalkState->MethodNode;
58467754Smsmith
58569746Smsmith    if (WalkState->Results)
58669746Smsmith    {
587167802Sjkim        ResultCount = WalkState->ResultCount;
58869746Smsmith    }
58967754Smsmith
59087031Smsmith    AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n",
591167802Sjkim            AcpiUtGetNodeName (Node), ResultCount);
59269746Smsmith
593167802Sjkim    /* From the top element of result stack */
594167802Sjkim
595167802Sjkim    Frame = WalkState->Results;
596167802Sjkim    Index = (ResultCount - 1) % ACPI_RESULTS_FRAME_OBJ_NUM;
597167802Sjkim
598167802Sjkim    for (i = 0; i < ResultCount; i++)
59967754Smsmith    {
600167802Sjkim        ObjDesc = Frame->Results.ObjDesc[Index];
601209746Sjkim        AcpiOsPrintf ("Result%u: ", i);
602117521Snjl        AcpiDmDisplayInternalObject (ObjDesc, WalkState);
603167802Sjkim        if (Index == 0)
604167802Sjkim        {
605167802Sjkim            Frame = Frame->Results.Next;
606167802Sjkim            Index = ACPI_RESULTS_FRAME_OBJ_NUM;
607167802Sjkim        }
608167802Sjkim        Index--;
60967754Smsmith    }
61067754Smsmith}
61167754Smsmith
61267754Smsmith
61367754Smsmith/*******************************************************************************
61467754Smsmith *
61567754Smsmith * FUNCTION:    AcpiDbDisplayCallingTree
61667754Smsmith *
61767754Smsmith * PARAMETERS:  None
61867754Smsmith *
61967754Smsmith * RETURN:      None
62067754Smsmith *
62167754Smsmith * DESCRIPTION: Display current calling tree of nested control methods
62267754Smsmith *
62367754Smsmith ******************************************************************************/
62467754Smsmith
62567754Smsmithvoid
626151937SjkimAcpiDbDisplayCallingTree (
627151937Sjkim    void)
62867754Smsmith{
62967754Smsmith    ACPI_WALK_STATE         *WalkState;
63067754Smsmith    ACPI_NAMESPACE_NODE     *Node;
63167754Smsmith
63267754Smsmith
63367754Smsmith    WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
63467754Smsmith    if (!WalkState)
63567754Smsmith    {
63667754Smsmith        AcpiOsPrintf ("There is no method currently executing\n");
63767754Smsmith        return;
63867754Smsmith    }
63967754Smsmith
64069450Smsmith    Node = WalkState->MethodNode;
64167754Smsmith    AcpiOsPrintf ("Current Control Method Call Tree\n");
64267754Smsmith
64399679Siwasaki    while (WalkState)
64467754Smsmith    {
64569450Smsmith        Node = WalkState->MethodNode;
64667754Smsmith
647123315Snjl        AcpiOsPrintf ("    [%4.4s]\n", AcpiUtGetNodeName (Node));
64867754Smsmith
64967754Smsmith        WalkState = WalkState->Next;
65067754Smsmith    }
65167754Smsmith}
65267754Smsmith
65367754Smsmith
65467754Smsmith/*******************************************************************************
65567754Smsmith *
656117521Snjl * FUNCTION:    AcpiDbDisplayObjectType
657117521Snjl *
658241973Sjkim * PARAMETERS:  Name            - User entered NS node handle or name
659117521Snjl *
660117521Snjl * RETURN:      None
661117521Snjl *
662123315Snjl * DESCRIPTION: Display type of an arbitrary NS node
663117521Snjl *
664117521Snjl ******************************************************************************/
665117521Snjl
666117521Snjlvoid
667117521SnjlAcpiDbDisplayObjectType (
668241973Sjkim    char                    *Name)
669117521Snjl{
670241973Sjkim    ACPI_NAMESPACE_NODE     *Node;
671117521Snjl    ACPI_DEVICE_INFO        *Info;
672117521Snjl    ACPI_STATUS             Status;
673193267Sjkim    UINT32                  i;
674117521Snjl
675117521Snjl
676241973Sjkim    Node = AcpiDbConvertToNode (Name);
677241973Sjkim    if (!Node)
678241973Sjkim    {
679241973Sjkim        return;
680241973Sjkim    }
681117521Snjl
682241973Sjkim    Status = AcpiGetObjectInfo (ACPI_CAST_PTR (ACPI_HANDLE, Node), &Info);
683197104Sjkim    if (ACPI_FAILURE (Status))
684117521Snjl    {
685197104Sjkim        AcpiOsPrintf ("Could not get object info, %s\n",
686197104Sjkim            AcpiFormatException (Status));
687197104Sjkim        return;
688197104Sjkim    }
689117521Snjl
690241973Sjkim    if (Info->Valid & ACPI_VALID_ADR)
691241973Sjkim    {
692241973Sjkim        AcpiOsPrintf ("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
693241973Sjkim            ACPI_FORMAT_UINT64 (Info->Address),
694241973Sjkim            Info->CurrentStatus, Info->Flags);
695241973Sjkim    }
696241973Sjkim    if (Info->Valid & ACPI_VALID_SXDS)
697241973Sjkim    {
698241973Sjkim        AcpiOsPrintf ("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
699241973Sjkim            Info->HighestDstates[0], Info->HighestDstates[1],
700241973Sjkim            Info->HighestDstates[2], Info->HighestDstates[3]);
701241973Sjkim    }
702241973Sjkim    if (Info->Valid & ACPI_VALID_SXWS)
703241973Sjkim    {
704241973Sjkim        AcpiOsPrintf ("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
705241973Sjkim            Info->LowestDstates[0], Info->LowestDstates[1],
706241973Sjkim            Info->LowestDstates[2], Info->LowestDstates[3],
707241973Sjkim            Info->LowestDstates[4]);
708241973Sjkim    }
709117521Snjl
710197104Sjkim    if (Info->Valid & ACPI_VALID_HID)
711197104Sjkim    {
712197104Sjkim        AcpiOsPrintf ("HID: %s\n", Info->HardwareId.String);
713117521Snjl    }
714197104Sjkim    if (Info->Valid & ACPI_VALID_UID)
715117521Snjl    {
716197104Sjkim        AcpiOsPrintf ("UID: %s\n", Info->UniqueId.String);
717117521Snjl    }
718241973Sjkim    if (Info->Valid & ACPI_VALID_SUB)
719241973Sjkim    {
720241973Sjkim        AcpiOsPrintf ("SUB: %s\n", Info->SubsystemId.String);
721241973Sjkim    }
722197104Sjkim    if (Info->Valid & ACPI_VALID_CID)
723197104Sjkim    {
724197104Sjkim        for (i = 0; i < Info->CompatibleIdList.Count; i++)
725197104Sjkim        {
726209746Sjkim            AcpiOsPrintf ("CID %u: %s\n", i,
727197104Sjkim                Info->CompatibleIdList.Ids[i].String);
728197104Sjkim        }
729197104Sjkim    }
730197104Sjkim
731197104Sjkim    ACPI_FREE (Info);
732117521Snjl}
733117521Snjl
734117521Snjl
735117521Snjl/*******************************************************************************
736117521Snjl *
73767754Smsmith * FUNCTION:    AcpiDbDisplayResultObject
73867754Smsmith *
73967754Smsmith * PARAMETERS:  ObjDesc         - Object to be displayed
74067754Smsmith *              WalkState       - Current walk state
74167754Smsmith *
74267754Smsmith * RETURN:      None
74367754Smsmith *
74467754Smsmith * DESCRIPTION: Display the result of an AML opcode
74567754Smsmith *
74691116Smsmith * Note: Curently only displays the result object if we are single stepping.
74791116Smsmith * However, this output may be useful in other contexts and could be enabled
74891116Smsmith * to do so if needed.
74991116Smsmith *
75067754Smsmith ******************************************************************************/
75167754Smsmith
75267754Smsmithvoid
75367754SmsmithAcpiDbDisplayResultObject (
75467754Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc,
75567754Smsmith    ACPI_WALK_STATE         *WalkState)
75667754Smsmith{
75767754Smsmith
75891116Smsmith    /* Only display if single stepping */
75991116Smsmith
76067754Smsmith    if (!AcpiGbl_CmSingleStep)
76167754Smsmith    {
76267754Smsmith        return;
76367754Smsmith    }
76467754Smsmith
76567754Smsmith    AcpiOsPrintf ("ResultObj: ");
766117521Snjl    AcpiDmDisplayInternalObject (ObjDesc, WalkState);
76767754Smsmith    AcpiOsPrintf ("\n");
76867754Smsmith}
76967754Smsmith
77067754Smsmith
77167754Smsmith/*******************************************************************************
77267754Smsmith *
77367754Smsmith * FUNCTION:    AcpiDbDisplayArgumentObject
77467754Smsmith *
77567754Smsmith * PARAMETERS:  ObjDesc         - Object to be displayed
77667754Smsmith *              WalkState       - Current walk state
77767754Smsmith *
77867754Smsmith * RETURN:      None
77967754Smsmith *
78067754Smsmith * DESCRIPTION: Display the result of an AML opcode
78167754Smsmith *
78267754Smsmith ******************************************************************************/
78367754Smsmith
78467754Smsmithvoid
78567754SmsmithAcpiDbDisplayArgumentObject (
78667754Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc,
78767754Smsmith    ACPI_WALK_STATE         *WalkState)
78867754Smsmith{
78967754Smsmith
79067754Smsmith    if (!AcpiGbl_CmSingleStep)
79167754Smsmith    {
79267754Smsmith        return;
79367754Smsmith    }
79467754Smsmith
79567754Smsmith    AcpiOsPrintf ("ArgObj:    ");
796117521Snjl    AcpiDmDisplayInternalObject (ObjDesc, WalkState);
79767754Smsmith}
79867754Smsmith
799114237Snjl
800231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
801114237Snjl/*******************************************************************************
802114237Snjl *
803114237Snjl * FUNCTION:    AcpiDbDisplayGpes
804114237Snjl *
805123315Snjl * PARAMETERS:  None
806114237Snjl *
807114237Snjl * RETURN:      None
808114237Snjl *
809123315Snjl * DESCRIPTION: Display the current GPE structures
810114237Snjl *
811114237Snjl ******************************************************************************/
812114237Snjl
813114237Snjlvoid
814151937SjkimAcpiDbDisplayGpes (
815151937Sjkim    void)
816114237Snjl{
817114237Snjl    ACPI_GPE_BLOCK_INFO     *GpeBlock;
818117521Snjl    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
819129684Snjl    ACPI_GPE_EVENT_INFO     *GpeEventInfo;
820129684Snjl    ACPI_GPE_REGISTER_INFO  *GpeRegisterInfo;
821207344Sjkim    char                    *GpeType;
822237412Sjkim    ACPI_GPE_NOTIFY_INFO    *Notify;
823129684Snjl    UINT32                  GpeIndex;
824129684Snjl    UINT32                  Block = 0;
825129684Snjl    UINT32                  i;
826129684Snjl    UINT32                  j;
827237412Sjkim    UINT32                  Count;
828129684Snjl    char                    Buffer[80];
829129684Snjl    ACPI_BUFFER             RetBuf;
830129684Snjl    ACPI_STATUS             Status;
831114237Snjl
832114237Snjl
833129684Snjl    RetBuf.Length = sizeof (Buffer);
834129684Snjl    RetBuf.Pointer = Buffer;
835129684Snjl
836129684Snjl    Block = 0;
837129684Snjl
838129684Snjl    /* Walk the GPE lists */
839129684Snjl
840117521Snjl    GpeXruptInfo = AcpiGbl_GpeXruptListHead;
841117521Snjl    while (GpeXruptInfo)
842114237Snjl    {
843117521Snjl        GpeBlock = GpeXruptInfo->GpeBlockListHead;
844117521Snjl        while (GpeBlock)
845117521Snjl        {
846129684Snjl            Status = AcpiGetName (GpeBlock->Node, ACPI_FULL_PATHNAME, &RetBuf);
847129684Snjl            if (ACPI_FAILURE (Status))
848129684Snjl            {
849129684Snjl                AcpiOsPrintf ("Could not convert name to pathname\n");
850129684Snjl            }
851129684Snjl
852207344Sjkim            if (GpeBlock->Node == AcpiGbl_FadtGpeDevice)
853207344Sjkim            {
854207344Sjkim                GpeType = "FADT-defined GPE block";
855207344Sjkim            }
856207344Sjkim            else
857207344Sjkim            {
858207344Sjkim                GpeType = "GPE Block Device";
859207344Sjkim            }
860151937Sjkim
861209746Sjkim            AcpiOsPrintf ("\nBlock %u - Info %p  DeviceNode %p [%s] - %s\n",
862207344Sjkim                Block, GpeBlock, GpeBlock->Node, Buffer, GpeType);
863207344Sjkim
864151937Sjkim            AcpiOsPrintf ("    Registers:    %u (%u GPEs)\n",
865206117Sjkim                GpeBlock->RegisterCount, GpeBlock->GpeCount);
866151937Sjkim
867206117Sjkim            AcpiOsPrintf ("    GPE range:    0x%X to 0x%X on interrupt %u\n",
868151937Sjkim                GpeBlock->BlockBaseNumber,
869206117Sjkim                GpeBlock->BlockBaseNumber + (GpeBlock->GpeCount - 1),
870206117Sjkim                GpeXruptInfo->InterruptNumber);
871151937Sjkim
872151937Sjkim            AcpiOsPrintf (
873151937Sjkim                "    RegisterInfo: %p  Status %8.8X%8.8X Enable %8.8X%8.8X\n",
874151937Sjkim                GpeBlock->RegisterInfo,
875167802Sjkim                ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->StatusAddress.Address),
876167802Sjkim                ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->EnableAddress.Address));
877151937Sjkim
878117521Snjl            AcpiOsPrintf ("    EventInfo:    %p\n", GpeBlock->EventInfo);
879114237Snjl
880129684Snjl            /* Examine each GPE Register within the block */
881129684Snjl
882129684Snjl            for (i = 0; i < GpeBlock->RegisterCount; i++)
883129684Snjl            {
884129684Snjl                GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
885129684Snjl
886129684Snjl                AcpiOsPrintf (
887206117Sjkim                    "    Reg %u: (GPE %.2X-%.2X)  RunEnable %2.2X WakeEnable %2.2X"
888206117Sjkim                    " Status %8.8X%8.8X Enable %8.8X%8.8X\n",
889206117Sjkim                    i, GpeRegisterInfo->BaseGpeNumber,
890206117Sjkim                    GpeRegisterInfo->BaseGpeNumber + (ACPI_GPE_REGISTER_WIDTH - 1),
891151937Sjkim                    GpeRegisterInfo->EnableForRun,
892206117Sjkim                    GpeRegisterInfo->EnableForWake,
893167802Sjkim                    ACPI_FORMAT_UINT64 (GpeRegisterInfo->StatusAddress.Address),
894167802Sjkim                    ACPI_FORMAT_UINT64 (GpeRegisterInfo->EnableAddress.Address));
895129684Snjl
896129684Snjl                /* Now look at the individual GPEs in this byte register */
897129684Snjl
898129684Snjl                for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
899129684Snjl                {
900129684Snjl                    GpeIndex = (i * ACPI_GPE_REGISTER_WIDTH) + j;
901129684Snjl                    GpeEventInfo = &GpeBlock->EventInfo[GpeIndex];
902129684Snjl
903281075Sdim                    if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) ==
904216471Sjkim                        ACPI_GPE_DISPATCH_NONE)
905129684Snjl                    {
906206117Sjkim                        /* This GPE is not used (no method or handler), ignore it */
907129684Snjl
908129684Snjl                        continue;
909129684Snjl                    }
910129684Snjl
911129684Snjl                    AcpiOsPrintf (
912209746Sjkim                        "        GPE %.2X: %p  RunRefs %2.2X Flags %2.2X (",
913206117Sjkim                        GpeBlock->BlockBaseNumber + GpeIndex, GpeEventInfo,
914216471Sjkim                        GpeEventInfo->RuntimeCount, GpeEventInfo->Flags);
915129684Snjl
916206117Sjkim                    /* Decode the flags byte */
917206117Sjkim
918129684Snjl                    if (GpeEventInfo->Flags & ACPI_GPE_LEVEL_TRIGGERED)
919129684Snjl                    {
920129684Snjl                        AcpiOsPrintf ("Level, ");
921129684Snjl                    }
922129684Snjl                    else
923129684Snjl                    {
924129684Snjl                        AcpiOsPrintf ("Edge,  ");
925129684Snjl                    }
926129684Snjl
927206117Sjkim                    if (GpeEventInfo->Flags & ACPI_GPE_CAN_WAKE)
928129684Snjl                    {
929206117Sjkim                        AcpiOsPrintf ("CanWake, ");
930129684Snjl                    }
931129684Snjl                    else
932129684Snjl                    {
933206117Sjkim                        AcpiOsPrintf ("RunOnly, ");
934129684Snjl                    }
935129684Snjl
936281075Sdim                    switch (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags))
937129684Snjl                    {
938216471Sjkim                    case ACPI_GPE_DISPATCH_NONE:
939250838Sjkim
940129684Snjl                        AcpiOsPrintf ("NotUsed");
941129684Snjl                        break;
942250838Sjkim
943216471Sjkim                    case ACPI_GPE_DISPATCH_METHOD:
944250838Sjkim
945216471Sjkim                        AcpiOsPrintf ("Method");
946216471Sjkim                        break;
947281075Sdim
948129684Snjl                    case ACPI_GPE_DISPATCH_HANDLER:
949250838Sjkim
950129684Snjl                        AcpiOsPrintf ("Handler");
951129684Snjl                        break;
952250838Sjkim
953216471Sjkim                    case ACPI_GPE_DISPATCH_NOTIFY:
954250838Sjkim
955237412Sjkim                        Count = 0;
956237412Sjkim                        Notify = GpeEventInfo->Dispatch.NotifyList;
957237412Sjkim                        while (Notify)
958237412Sjkim                        {
959237412Sjkim                            Count++;
960237412Sjkim                            Notify = Notify->Next;
961237412Sjkim                        }
962237412Sjkim                        AcpiOsPrintf ("Implicit Notify on %u devices", Count);
963129684Snjl                        break;
964250838Sjkim
965281075Sdim                    case ACPI_GPE_DISPATCH_RAW_HANDLER:
966281075Sdim
967281075Sdim                        AcpiOsPrintf ("RawHandler");
968281075Sdim                        break;
969281075Sdim
970129684Snjl                    default:
971250838Sjkim
972129684Snjl                        AcpiOsPrintf ("UNKNOWN: %X",
973281075Sdim                            ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags));
974129684Snjl                        break;
975129684Snjl                    }
976129684Snjl
977206117Sjkim                    AcpiOsPrintf (")\n");
978129684Snjl                }
979129684Snjl            }
980129684Snjl            Block++;
981117521Snjl            GpeBlock = GpeBlock->Next;
982117521Snjl        }
983117521Snjl        GpeXruptInfo = GpeXruptInfo->Next;
984114237Snjl    }
985114237Snjl}
986231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
987114237Snjl
988220663Sjkim
989218590Sjkim/*******************************************************************************
990218590Sjkim *
991218590Sjkim * FUNCTION:    AcpiDbDisplayHandlers
992218590Sjkim *
993218590Sjkim * PARAMETERS:  None
994218590Sjkim *
995218590Sjkim * RETURN:      None
996218590Sjkim *
997218590Sjkim * DESCRIPTION: Display the currently installed global handlers
998218590Sjkim *
999218590Sjkim ******************************************************************************/
1000218590Sjkim
1001218590Sjkimvoid
1002218590SjkimAcpiDbDisplayHandlers (
1003218590Sjkim    void)
1004218590Sjkim{
1005218590Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc;
1006218590Sjkim    ACPI_OPERAND_OBJECT     *HandlerObj;
1007218590Sjkim    ACPI_ADR_SPACE_TYPE     SpaceId;
1008218590Sjkim    UINT32                  i;
1009218590Sjkim
1010218590Sjkim
1011218590Sjkim    /* Operation region handlers */
1012218590Sjkim
1013249663Sjkim    AcpiOsPrintf ("\nOperation Region Handlers at the namespace root:\n");
1014218590Sjkim
1015218590Sjkim    ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
1016218590Sjkim    if (ObjDesc)
1017218590Sjkim    {
1018220663Sjkim        for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_SpaceIdList); i++)
1019218590Sjkim        {
1020220663Sjkim            SpaceId = AcpiGbl_SpaceIdList[i];
1021218590Sjkim            HandlerObj = ObjDesc->Device.Handler;
1022218590Sjkim
1023218590Sjkim            AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1024218590Sjkim                AcpiUtGetRegionName ((UINT8) SpaceId), SpaceId);
1025218590Sjkim
1026218590Sjkim            while (HandlerObj)
1027218590Sjkim            {
1028228110Sjkim                if (AcpiGbl_SpaceIdList[i] == HandlerObj->AddressSpace.SpaceId)
1029218590Sjkim                {
1030218590Sjkim                    AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
1031218590Sjkim                        (HandlerObj->AddressSpace.HandlerFlags &
1032218590Sjkim                            ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User",
1033218590Sjkim                        HandlerObj->AddressSpace.Handler);
1034218590Sjkim                    goto FoundHandler;
1035218590Sjkim                }
1036218590Sjkim
1037218590Sjkim                HandlerObj = HandlerObj->AddressSpace.Next;
1038218590Sjkim            }
1039218590Sjkim
1040218590Sjkim            /* There is no handler for this SpaceId */
1041218590Sjkim
1042218590Sjkim            AcpiOsPrintf ("None\n");
1043218590Sjkim
1044218590Sjkim        FoundHandler:;
1045218590Sjkim        }
1046228110Sjkim
1047228110Sjkim        /* Find all handlers for user-defined SpaceIDs */
1048228110Sjkim
1049228110Sjkim        HandlerObj = ObjDesc->Device.Handler;
1050228110Sjkim        while (HandlerObj)
1051228110Sjkim        {
1052228110Sjkim            if (HandlerObj->AddressSpace.SpaceId >= ACPI_USER_REGION_BEGIN)
1053228110Sjkim            {
1054228110Sjkim                AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1055228110Sjkim                    "User-defined ID", HandlerObj->AddressSpace.SpaceId);
1056228110Sjkim                AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING,
1057228110Sjkim                    (HandlerObj->AddressSpace.HandlerFlags &
1058228110Sjkim                        ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User",
1059228110Sjkim                    HandlerObj->AddressSpace.Handler);
1060228110Sjkim            }
1061228110Sjkim
1062228110Sjkim            HandlerObj = HandlerObj->AddressSpace.Next;
1063228110Sjkim        }
1064218590Sjkim    }
1065218590Sjkim
1066231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
1067231844Sjkim
1068218590Sjkim    /* Fixed event handlers */
1069218590Sjkim
1070218590Sjkim    AcpiOsPrintf ("\nFixed Event Handlers:\n");
1071218590Sjkim
1072218590Sjkim    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
1073218590Sjkim    {
1074218590Sjkim        AcpiOsPrintf (ACPI_PREDEFINED_PREFIX, AcpiUtGetEventName (i), i);
1075218590Sjkim        if (AcpiGbl_FixedEventHandlers[i].Handler)
1076218590Sjkim        {
1077218590Sjkim            AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User",
1078218590Sjkim                AcpiGbl_FixedEventHandlers[i].Handler);
1079218590Sjkim        }
1080218590Sjkim        else
1081218590Sjkim        {
1082218590Sjkim            AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1083218590Sjkim        }
1084218590Sjkim    }
1085218590Sjkim
1086231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
1087231844Sjkim
1088218590Sjkim    /* Miscellaneous global handlers */
1089218590Sjkim
1090218590Sjkim    AcpiOsPrintf ("\nMiscellaneous Global Handlers:\n");
1091218590Sjkim
1092220663Sjkim    for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiGbl_HandlerList); i++)
1093218590Sjkim    {
1094220663Sjkim        AcpiOsPrintf (ACPI_HANDLER_NAME_STRING, AcpiGbl_HandlerList[i].Name);
1095220663Sjkim        if (AcpiGbl_HandlerList[i].Handler)
1096218590Sjkim        {
1097218590Sjkim            AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING, "User",
1098220663Sjkim                AcpiGbl_HandlerList[i].Handler);
1099218590Sjkim        }
1100218590Sjkim        else
1101218590Sjkim        {
1102218590Sjkim            AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None");
1103218590Sjkim        }
1104218590Sjkim    }
1105249663Sjkim
1106249663Sjkim
1107249663Sjkim    /* Other handlers that are installed throughout the namespace */
1108249663Sjkim
1109249663Sjkim    AcpiOsPrintf ("\nOperation Region Handlers for specific devices:\n");
1110249663Sjkim
1111249663Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1112249663Sjkim                ACPI_UINT32_MAX, AcpiDbDisplayNonRootHandlers,
1113249663Sjkim                NULL, NULL, NULL);
1114218590Sjkim}
1115218590Sjkim
1116249663Sjkim
1117249663Sjkim/*******************************************************************************
1118249663Sjkim *
1119249663Sjkim * FUNCTION:    AcpiDbDisplayNonRootHandlers
1120249663Sjkim *
1121249663Sjkim * PARAMETERS:  ACPI_WALK_CALLBACK
1122249663Sjkim *
1123249663Sjkim * RETURN:      Status
1124249663Sjkim *
1125249663Sjkim * DESCRIPTION: Display information about all handlers installed for a
1126249663Sjkim *              device object.
1127249663Sjkim *
1128249663Sjkim ******************************************************************************/
1129249663Sjkim
1130249663Sjkimstatic ACPI_STATUS
1131249663SjkimAcpiDbDisplayNonRootHandlers (
1132249663Sjkim    ACPI_HANDLE             ObjHandle,
1133249663Sjkim    UINT32                  NestingLevel,
1134249663Sjkim    void                    *Context,
1135249663Sjkim    void                    **ReturnValue)
1136249663Sjkim{
1137249663Sjkim    ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
1138249663Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc;
1139249663Sjkim    ACPI_OPERAND_OBJECT     *HandlerObj;
1140249663Sjkim    char                    *Pathname;
1141249663Sjkim
1142249663Sjkim
1143249663Sjkim    ObjDesc = AcpiNsGetAttachedObject (Node);
1144249663Sjkim    if (!ObjDesc)
1145249663Sjkim    {
1146249663Sjkim        return (AE_OK);
1147249663Sjkim    }
1148249663Sjkim
1149249663Sjkim    Pathname = AcpiNsGetExternalPathname (Node);
1150249663Sjkim    if (!Pathname)
1151249663Sjkim    {
1152249663Sjkim        return (AE_OK);
1153249663Sjkim    }
1154249663Sjkim
1155249663Sjkim    /* Display all handlers associated with this device */
1156249663Sjkim
1157249663Sjkim    HandlerObj = ObjDesc->Device.Handler;
1158249663Sjkim    while (HandlerObj)
1159249663Sjkim    {
1160249663Sjkim        AcpiOsPrintf (ACPI_PREDEFINED_PREFIX,
1161249663Sjkim            AcpiUtGetRegionName ((UINT8) HandlerObj->AddressSpace.SpaceId),
1162249663Sjkim            HandlerObj->AddressSpace.SpaceId);
1163249663Sjkim
1164249663Sjkim        AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING2,
1165249663Sjkim            (HandlerObj->AddressSpace.HandlerFlags &
1166249663Sjkim                ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User",
1167249663Sjkim            HandlerObj->AddressSpace.Handler);
1168249663Sjkim
1169249663Sjkim        AcpiOsPrintf (" Device Name: %s (%p)\n", Pathname, Node);
1170249663Sjkim
1171249663Sjkim        HandlerObj = HandlerObj->AddressSpace.Next;
1172249663Sjkim    }
1173249663Sjkim
1174249663Sjkim    ACPI_FREE (Pathname);
1175249663Sjkim    return (AE_OK);
1176249663Sjkim}
1177249663Sjkim
1178102550Siwasaki#endif /* ACPI_DEBUGGER */
1179