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