1a9643ea8Slogwang /*******************************************************************************
2a9643ea8Slogwang *
3a9643ea8Slogwang * Module Name: dbobject - ACPI object decode and display
4a9643ea8Slogwang *
5a9643ea8Slogwang ******************************************************************************/
6a9643ea8Slogwang
7*22ce4affSfengbojiang /******************************************************************************
8*22ce4affSfengbojiang *
9*22ce4affSfengbojiang * 1. Copyright Notice
10*22ce4affSfengbojiang *
11*22ce4affSfengbojiang * Some or all of this work - Copyright (c) 1999 - 2020, Intel Corp.
12a9643ea8Slogwang * All rights reserved.
13a9643ea8Slogwang *
14*22ce4affSfengbojiang * 2. License
15*22ce4affSfengbojiang *
16*22ce4affSfengbojiang * 2.1. This is your license from Intel Corp. under its intellectual property
17*22ce4affSfengbojiang * rights. You may have additional license terms from the party that provided
18*22ce4affSfengbojiang * you this software, covering your right to use that party's intellectual
19*22ce4affSfengbojiang * property rights.
20*22ce4affSfengbojiang *
21*22ce4affSfengbojiang * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*22ce4affSfengbojiang * copy of the source code appearing in this file ("Covered Code") an
23*22ce4affSfengbojiang * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*22ce4affSfengbojiang * base code distributed originally by Intel ("Original Intel Code") to copy,
25*22ce4affSfengbojiang * make derivatives, distribute, use and display any portion of the Covered
26*22ce4affSfengbojiang * Code in any form, with the right to sublicense such rights; and
27*22ce4affSfengbojiang *
28*22ce4affSfengbojiang * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*22ce4affSfengbojiang * license (with the right to sublicense), under only those claims of Intel
30*22ce4affSfengbojiang * patents that are infringed by the Original Intel Code, to make, use, sell,
31*22ce4affSfengbojiang * offer to sell, and import the Covered Code and derivative works thereof
32*22ce4affSfengbojiang * solely to the minimum extent necessary to exercise the above copyright
33*22ce4affSfengbojiang * license, and in no event shall the patent license extend to any additions
34*22ce4affSfengbojiang * to or modifications of the Original Intel Code. No other license or right
35*22ce4affSfengbojiang * is granted directly or by implication, estoppel or otherwise;
36*22ce4affSfengbojiang *
37*22ce4affSfengbojiang * The above copyright and patent license is granted only if the following
38*22ce4affSfengbojiang * conditions are met:
39*22ce4affSfengbojiang *
40*22ce4affSfengbojiang * 3. Conditions
41*22ce4affSfengbojiang *
42*22ce4affSfengbojiang * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*22ce4affSfengbojiang * Redistribution of source code of any substantial portion of the Covered
44*22ce4affSfengbojiang * Code or modification with rights to further distribute source must include
45*22ce4affSfengbojiang * the above Copyright Notice, the above License, this list of Conditions,
46*22ce4affSfengbojiang * and the following Disclaimer and Export Compliance provision. In addition,
47*22ce4affSfengbojiang * Licensee must cause all Covered Code to which Licensee contributes to
48*22ce4affSfengbojiang * contain a file documenting the changes Licensee made to create that Covered
49*22ce4affSfengbojiang * Code and the date of any change. Licensee must include in that file the
50*22ce4affSfengbojiang * documentation of any changes made by any predecessor Licensee. Licensee
51*22ce4affSfengbojiang * must include a prominent statement that the modification is derived,
52*22ce4affSfengbojiang * directly or indirectly, from Original Intel Code.
53*22ce4affSfengbojiang *
54*22ce4affSfengbojiang * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*22ce4affSfengbojiang * Redistribution of source code of any substantial portion of the Covered
56*22ce4affSfengbojiang * Code or modification without rights to further distribute source must
57*22ce4affSfengbojiang * include the following Disclaimer and Export Compliance provision in the
58*22ce4affSfengbojiang * documentation and/or other materials provided with distribution. In
59*22ce4affSfengbojiang * addition, Licensee may not authorize further sublicense of source of any
60*22ce4affSfengbojiang * portion of the Covered Code, and must include terms to the effect that the
61*22ce4affSfengbojiang * license from Licensee to its licensee is limited to the intellectual
62*22ce4affSfengbojiang * property embodied in the software Licensee provides to its licensee, and
63*22ce4affSfengbojiang * not to intellectual property embodied in modifications its licensee may
64*22ce4affSfengbojiang * make.
65*22ce4affSfengbojiang *
66*22ce4affSfengbojiang * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*22ce4affSfengbojiang * substantial portion of the Covered Code or modification must reproduce the
68*22ce4affSfengbojiang * above Copyright Notice, and the following Disclaimer and Export Compliance
69*22ce4affSfengbojiang * provision in the documentation and/or other materials provided with the
70*22ce4affSfengbojiang * distribution.
71*22ce4affSfengbojiang *
72*22ce4affSfengbojiang * 3.4. Intel retains all right, title, and interest in and to the Original
73*22ce4affSfengbojiang * Intel Code.
74*22ce4affSfengbojiang *
75*22ce4affSfengbojiang * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*22ce4affSfengbojiang * Intel shall be used in advertising or otherwise to promote the sale, use or
77*22ce4affSfengbojiang * other dealings in products derived from or relating to the Covered Code
78*22ce4affSfengbojiang * without prior written authorization from Intel.
79*22ce4affSfengbojiang *
80*22ce4affSfengbojiang * 4. Disclaimer and Export Compliance
81*22ce4affSfengbojiang *
82*22ce4affSfengbojiang * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*22ce4affSfengbojiang * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*22ce4affSfengbojiang * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*22ce4affSfengbojiang * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*22ce4affSfengbojiang * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*22ce4affSfengbojiang * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*22ce4affSfengbojiang * PARTICULAR PURPOSE.
89*22ce4affSfengbojiang *
90*22ce4affSfengbojiang * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*22ce4affSfengbojiang * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*22ce4affSfengbojiang * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*22ce4affSfengbojiang * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*22ce4affSfengbojiang * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*22ce4affSfengbojiang * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*22ce4affSfengbojiang * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*22ce4affSfengbojiang * LIMITED REMEDY.
98*22ce4affSfengbojiang *
99*22ce4affSfengbojiang * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*22ce4affSfengbojiang * software or system incorporating such software without first obtaining any
101*22ce4affSfengbojiang * required license or other approval from the U. S. Department of Commerce or
102*22ce4affSfengbojiang * any other agency or department of the United States Government. In the
103*22ce4affSfengbojiang * event Licensee exports any such software from the United States or
104*22ce4affSfengbojiang * re-exports any such software from a foreign destination, Licensee shall
105*22ce4affSfengbojiang * ensure that the distribution and export/re-export of the software is in
106*22ce4affSfengbojiang * compliance with all laws, regulations, orders, or other restrictions of the
107*22ce4affSfengbojiang * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*22ce4affSfengbojiang * any of its subsidiaries will export/re-export any technical data, process,
109*22ce4affSfengbojiang * software, or service, directly or indirectly, to any country for which the
110*22ce4affSfengbojiang * United States government or any agency thereof requires an export license,
111*22ce4affSfengbojiang * other governmental approval, or letter of assurance, without first obtaining
112*22ce4affSfengbojiang * such license, approval or letter.
113*22ce4affSfengbojiang *
114*22ce4affSfengbojiang *****************************************************************************
115*22ce4affSfengbojiang *
116*22ce4affSfengbojiang * Alternatively, you may choose to be licensed under the terms of the
117*22ce4affSfengbojiang * following license:
118*22ce4affSfengbojiang *
119a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without
120a9643ea8Slogwang * modification, are permitted provided that the following conditions
121a9643ea8Slogwang * are met:
122a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright
123a9643ea8Slogwang * notice, this list of conditions, and the following disclaimer,
124a9643ea8Slogwang * without modification.
125a9643ea8Slogwang * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126a9643ea8Slogwang * substantially similar to the "NO WARRANTY" disclaimer below
127a9643ea8Slogwang * ("Disclaimer") and any redistribution must be conditioned upon
128a9643ea8Slogwang * including a substantially similar Disclaimer requirement for further
129a9643ea8Slogwang * binary redistribution.
130a9643ea8Slogwang * 3. Neither the names of the above-listed copyright holders nor the names
131a9643ea8Slogwang * of any contributors may be used to endorse or promote products derived
132a9643ea8Slogwang * from this software without specific prior written permission.
133a9643ea8Slogwang *
134*22ce4affSfengbojiang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*22ce4affSfengbojiang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*22ce4affSfengbojiang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*22ce4affSfengbojiang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*22ce4affSfengbojiang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*22ce4affSfengbojiang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*22ce4affSfengbojiang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*22ce4affSfengbojiang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*22ce4affSfengbojiang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*22ce4affSfengbojiang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*22ce4affSfengbojiang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*22ce4affSfengbojiang *
146*22ce4affSfengbojiang * Alternatively, you may choose to be licensed under the terms of the
147a9643ea8Slogwang * GNU General Public License ("GPL") version 2 as published by the Free
148a9643ea8Slogwang * Software Foundation.
149a9643ea8Slogwang *
150*22ce4affSfengbojiang *****************************************************************************/
151a9643ea8Slogwang
152a9643ea8Slogwang #include <contrib/dev/acpica/include/acpi.h>
153a9643ea8Slogwang #include <contrib/dev/acpica/include/accommon.h>
154a9643ea8Slogwang #include <contrib/dev/acpica/include/acnamesp.h>
155a9643ea8Slogwang #include <contrib/dev/acpica/include/acdebug.h>
156a9643ea8Slogwang
157a9643ea8Slogwang
158a9643ea8Slogwang #define _COMPONENT ACPI_CA_DEBUGGER
159a9643ea8Slogwang ACPI_MODULE_NAME ("dbobject")
160a9643ea8Slogwang
161a9643ea8Slogwang
162a9643ea8Slogwang /* Local prototypes */
163a9643ea8Slogwang
164a9643ea8Slogwang static void
165a9643ea8Slogwang AcpiDbDecodeNode (
166a9643ea8Slogwang ACPI_NAMESPACE_NODE *Node);
167a9643ea8Slogwang
168a9643ea8Slogwang
169a9643ea8Slogwang /*******************************************************************************
170a9643ea8Slogwang *
171a9643ea8Slogwang * FUNCTION: AcpiDbDumpMethodInfo
172a9643ea8Slogwang *
173a9643ea8Slogwang * PARAMETERS: Status - Method execution status
174a9643ea8Slogwang * WalkState - Current state of the parse tree walk
175a9643ea8Slogwang *
176a9643ea8Slogwang * RETURN: None
177a9643ea8Slogwang *
178a9643ea8Slogwang * DESCRIPTION: Called when a method has been aborted because of an error.
179a9643ea8Slogwang * Dumps the method execution stack, and the method locals/args,
180a9643ea8Slogwang * and disassembles the AML opcode that failed.
181a9643ea8Slogwang *
182a9643ea8Slogwang ******************************************************************************/
183a9643ea8Slogwang
184a9643ea8Slogwang void
AcpiDbDumpMethodInfo(ACPI_STATUS Status,ACPI_WALK_STATE * WalkState)185a9643ea8Slogwang AcpiDbDumpMethodInfo (
186a9643ea8Slogwang ACPI_STATUS Status,
187a9643ea8Slogwang ACPI_WALK_STATE *WalkState)
188a9643ea8Slogwang {
189a9643ea8Slogwang ACPI_THREAD_STATE *Thread;
190*22ce4affSfengbojiang ACPI_NAMESPACE_NODE *Node;
191a9643ea8Slogwang
192a9643ea8Slogwang
193*22ce4affSfengbojiang Node = WalkState->MethodNode;
194*22ce4affSfengbojiang
195*22ce4affSfengbojiang /* There are no locals or arguments for the module-level code case */
196*22ce4affSfengbojiang
197*22ce4affSfengbojiang if (Node == AcpiGbl_RootNode)
198*22ce4affSfengbojiang {
199*22ce4affSfengbojiang return;
200*22ce4affSfengbojiang }
201*22ce4affSfengbojiang
202a9643ea8Slogwang /* Ignore control codes, they are not errors */
203a9643ea8Slogwang
204a9643ea8Slogwang if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL)
205a9643ea8Slogwang {
206a9643ea8Slogwang return;
207a9643ea8Slogwang }
208a9643ea8Slogwang
209a9643ea8Slogwang /* We may be executing a deferred opcode */
210a9643ea8Slogwang
211a9643ea8Slogwang if (WalkState->DeferredNode)
212a9643ea8Slogwang {
213a9643ea8Slogwang AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
214a9643ea8Slogwang return;
215a9643ea8Slogwang }
216a9643ea8Slogwang
217a9643ea8Slogwang /*
218a9643ea8Slogwang * If there is no Thread, we are not actually executing a method.
219a9643ea8Slogwang * This can happen when the iASL compiler calls the interpreter
220a9643ea8Slogwang * to perform constant folding.
221a9643ea8Slogwang */
222a9643ea8Slogwang Thread = WalkState->Thread;
223a9643ea8Slogwang if (!Thread)
224a9643ea8Slogwang {
225a9643ea8Slogwang return;
226a9643ea8Slogwang }
227a9643ea8Slogwang
228a9643ea8Slogwang /* Display the method locals and arguments */
229a9643ea8Slogwang
230a9643ea8Slogwang AcpiOsPrintf ("\n");
231a9643ea8Slogwang AcpiDbDecodeLocals (WalkState);
232a9643ea8Slogwang AcpiOsPrintf ("\n");
233a9643ea8Slogwang AcpiDbDecodeArguments (WalkState);
234a9643ea8Slogwang AcpiOsPrintf ("\n");
235a9643ea8Slogwang }
236a9643ea8Slogwang
237a9643ea8Slogwang
238a9643ea8Slogwang /*******************************************************************************
239a9643ea8Slogwang *
240a9643ea8Slogwang * FUNCTION: AcpiDbDecodeInternalObject
241a9643ea8Slogwang *
242a9643ea8Slogwang * PARAMETERS: ObjDesc - Object to be displayed
243a9643ea8Slogwang *
244a9643ea8Slogwang * RETURN: None
245a9643ea8Slogwang *
246a9643ea8Slogwang * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers.
247a9643ea8Slogwang *
248a9643ea8Slogwang ******************************************************************************/
249a9643ea8Slogwang
250a9643ea8Slogwang void
AcpiDbDecodeInternalObject(ACPI_OPERAND_OBJECT * ObjDesc)251a9643ea8Slogwang AcpiDbDecodeInternalObject (
252a9643ea8Slogwang ACPI_OPERAND_OBJECT *ObjDesc)
253a9643ea8Slogwang {
254a9643ea8Slogwang UINT32 i;
255a9643ea8Slogwang
256a9643ea8Slogwang
257a9643ea8Slogwang if (!ObjDesc)
258a9643ea8Slogwang {
259a9643ea8Slogwang AcpiOsPrintf (" Uninitialized");
260a9643ea8Slogwang return;
261a9643ea8Slogwang }
262a9643ea8Slogwang
263a9643ea8Slogwang if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
264a9643ea8Slogwang {
265a9643ea8Slogwang AcpiOsPrintf (" %p [%s]", ObjDesc,
266a9643ea8Slogwang AcpiUtGetDescriptorName (ObjDesc));
267a9643ea8Slogwang return;
268a9643ea8Slogwang }
269a9643ea8Slogwang
270a9643ea8Slogwang AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc));
271a9643ea8Slogwang
272a9643ea8Slogwang switch (ObjDesc->Common.Type)
273a9643ea8Slogwang {
274a9643ea8Slogwang case ACPI_TYPE_INTEGER:
275a9643ea8Slogwang
276a9643ea8Slogwang AcpiOsPrintf (" %8.8X%8.8X",
277a9643ea8Slogwang ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
278a9643ea8Slogwang break;
279a9643ea8Slogwang
280a9643ea8Slogwang case ACPI_TYPE_STRING:
281a9643ea8Slogwang
282a9643ea8Slogwang AcpiOsPrintf ("(%u) \"%.60s",
283a9643ea8Slogwang ObjDesc->String.Length, ObjDesc->String.Pointer);
284a9643ea8Slogwang
285a9643ea8Slogwang if (ObjDesc->String.Length > 60)
286a9643ea8Slogwang {
287a9643ea8Slogwang AcpiOsPrintf ("...");
288a9643ea8Slogwang }
289a9643ea8Slogwang else
290a9643ea8Slogwang {
291a9643ea8Slogwang AcpiOsPrintf ("\"");
292a9643ea8Slogwang }
293a9643ea8Slogwang break;
294a9643ea8Slogwang
295a9643ea8Slogwang case ACPI_TYPE_BUFFER:
296a9643ea8Slogwang
297a9643ea8Slogwang AcpiOsPrintf ("(%u)", ObjDesc->Buffer.Length);
298a9643ea8Slogwang for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++)
299a9643ea8Slogwang {
300a9643ea8Slogwang AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]);
301a9643ea8Slogwang }
302a9643ea8Slogwang break;
303a9643ea8Slogwang
304a9643ea8Slogwang default:
305a9643ea8Slogwang
306a9643ea8Slogwang AcpiOsPrintf (" %p", ObjDesc);
307a9643ea8Slogwang break;
308a9643ea8Slogwang }
309a9643ea8Slogwang }
310a9643ea8Slogwang
311a9643ea8Slogwang
312a9643ea8Slogwang /*******************************************************************************
313a9643ea8Slogwang *
314a9643ea8Slogwang * FUNCTION: AcpiDbDecodeNode
315a9643ea8Slogwang *
316a9643ea8Slogwang * PARAMETERS: Node - Object to be displayed
317a9643ea8Slogwang *
318a9643ea8Slogwang * RETURN: None
319a9643ea8Slogwang *
320a9643ea8Slogwang * DESCRIPTION: Short display of a namespace node
321a9643ea8Slogwang *
322a9643ea8Slogwang ******************************************************************************/
323a9643ea8Slogwang
324a9643ea8Slogwang static void
AcpiDbDecodeNode(ACPI_NAMESPACE_NODE * Node)325a9643ea8Slogwang AcpiDbDecodeNode (
326a9643ea8Slogwang ACPI_NAMESPACE_NODE *Node)
327a9643ea8Slogwang {
328a9643ea8Slogwang
329a9643ea8Slogwang AcpiOsPrintf ("<Node> Name %4.4s",
330a9643ea8Slogwang AcpiUtGetNodeName (Node));
331a9643ea8Slogwang
332a9643ea8Slogwang if (Node->Flags & ANOBJ_METHOD_ARG)
333a9643ea8Slogwang {
334a9643ea8Slogwang AcpiOsPrintf (" [Method Arg]");
335a9643ea8Slogwang }
336a9643ea8Slogwang if (Node->Flags & ANOBJ_METHOD_LOCAL)
337a9643ea8Slogwang {
338a9643ea8Slogwang AcpiOsPrintf (" [Method Local]");
339a9643ea8Slogwang }
340a9643ea8Slogwang
341a9643ea8Slogwang switch (Node->Type)
342a9643ea8Slogwang {
343a9643ea8Slogwang /* These types have no attached object */
344a9643ea8Slogwang
345a9643ea8Slogwang case ACPI_TYPE_DEVICE:
346a9643ea8Slogwang
347a9643ea8Slogwang AcpiOsPrintf (" Device");
348a9643ea8Slogwang break;
349a9643ea8Slogwang
350a9643ea8Slogwang case ACPI_TYPE_THERMAL:
351a9643ea8Slogwang
352a9643ea8Slogwang AcpiOsPrintf (" Thermal Zone");
353a9643ea8Slogwang break;
354a9643ea8Slogwang
355a9643ea8Slogwang default:
356a9643ea8Slogwang
357a9643ea8Slogwang AcpiDbDecodeInternalObject (AcpiNsGetAttachedObject (Node));
358a9643ea8Slogwang break;
359a9643ea8Slogwang }
360a9643ea8Slogwang }
361a9643ea8Slogwang
362a9643ea8Slogwang
363a9643ea8Slogwang /*******************************************************************************
364a9643ea8Slogwang *
365a9643ea8Slogwang * FUNCTION: AcpiDbDisplayInternalObject
366a9643ea8Slogwang *
367a9643ea8Slogwang * PARAMETERS: ObjDesc - Object to be displayed
368a9643ea8Slogwang * WalkState - Current walk state
369a9643ea8Slogwang *
370a9643ea8Slogwang * RETURN: None
371a9643ea8Slogwang *
372a9643ea8Slogwang * DESCRIPTION: Short display of an internal object
373a9643ea8Slogwang *
374a9643ea8Slogwang ******************************************************************************/
375a9643ea8Slogwang
376a9643ea8Slogwang void
AcpiDbDisplayInternalObject(ACPI_OPERAND_OBJECT * ObjDesc,ACPI_WALK_STATE * WalkState)377a9643ea8Slogwang AcpiDbDisplayInternalObject (
378a9643ea8Slogwang ACPI_OPERAND_OBJECT *ObjDesc,
379a9643ea8Slogwang ACPI_WALK_STATE *WalkState)
380a9643ea8Slogwang {
381a9643ea8Slogwang UINT8 Type;
382a9643ea8Slogwang
383a9643ea8Slogwang
384a9643ea8Slogwang AcpiOsPrintf ("%p ", ObjDesc);
385a9643ea8Slogwang
386a9643ea8Slogwang if (!ObjDesc)
387a9643ea8Slogwang {
388a9643ea8Slogwang AcpiOsPrintf ("<Null Object>\n");
389a9643ea8Slogwang return;
390a9643ea8Slogwang }
391a9643ea8Slogwang
392a9643ea8Slogwang /* Decode the object type */
393a9643ea8Slogwang
394a9643ea8Slogwang switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
395a9643ea8Slogwang {
396a9643ea8Slogwang case ACPI_DESC_TYPE_PARSER:
397a9643ea8Slogwang
398a9643ea8Slogwang AcpiOsPrintf ("<Parser> ");
399a9643ea8Slogwang break;
400a9643ea8Slogwang
401a9643ea8Slogwang case ACPI_DESC_TYPE_NAMED:
402a9643ea8Slogwang
403a9643ea8Slogwang AcpiDbDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc);
404a9643ea8Slogwang break;
405a9643ea8Slogwang
406a9643ea8Slogwang case ACPI_DESC_TYPE_OPERAND:
407a9643ea8Slogwang
408a9643ea8Slogwang Type = ObjDesc->Common.Type;
409a9643ea8Slogwang if (Type > ACPI_TYPE_LOCAL_MAX)
410a9643ea8Slogwang {
411a9643ea8Slogwang AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type);
412a9643ea8Slogwang return;
413a9643ea8Slogwang }
414a9643ea8Slogwang
415a9643ea8Slogwang /* Decode the ACPI object type */
416a9643ea8Slogwang
417a9643ea8Slogwang switch (ObjDesc->Common.Type)
418a9643ea8Slogwang {
419a9643ea8Slogwang case ACPI_TYPE_LOCAL_REFERENCE:
420a9643ea8Slogwang
421a9643ea8Slogwang AcpiOsPrintf ("[%s] ", AcpiUtGetReferenceName (ObjDesc));
422a9643ea8Slogwang
423*22ce4affSfengbojiang /* Decode the reference */
424a9643ea8Slogwang
425a9643ea8Slogwang switch (ObjDesc->Reference.Class)
426a9643ea8Slogwang {
427a9643ea8Slogwang case ACPI_REFCLASS_LOCAL:
428a9643ea8Slogwang
429a9643ea8Slogwang AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
430a9643ea8Slogwang if (WalkState)
431a9643ea8Slogwang {
432a9643ea8Slogwang ObjDesc = WalkState->LocalVariables
433a9643ea8Slogwang [ObjDesc->Reference.Value].Object;
434a9643ea8Slogwang AcpiOsPrintf ("%p", ObjDesc);
435a9643ea8Slogwang AcpiDbDecodeInternalObject (ObjDesc);
436a9643ea8Slogwang }
437a9643ea8Slogwang break;
438a9643ea8Slogwang
439a9643ea8Slogwang case ACPI_REFCLASS_ARG:
440a9643ea8Slogwang
441a9643ea8Slogwang AcpiOsPrintf ("%X ", ObjDesc->Reference.Value);
442a9643ea8Slogwang if (WalkState)
443a9643ea8Slogwang {
444a9643ea8Slogwang ObjDesc = WalkState->Arguments
445a9643ea8Slogwang [ObjDesc->Reference.Value].Object;
446a9643ea8Slogwang AcpiOsPrintf ("%p", ObjDesc);
447a9643ea8Slogwang AcpiDbDecodeInternalObject (ObjDesc);
448a9643ea8Slogwang }
449a9643ea8Slogwang break;
450a9643ea8Slogwang
451a9643ea8Slogwang case ACPI_REFCLASS_INDEX:
452a9643ea8Slogwang
453a9643ea8Slogwang switch (ObjDesc->Reference.TargetType)
454a9643ea8Slogwang {
455a9643ea8Slogwang case ACPI_TYPE_BUFFER_FIELD:
456a9643ea8Slogwang
457a9643ea8Slogwang AcpiOsPrintf ("%p", ObjDesc->Reference.Object);
458a9643ea8Slogwang AcpiDbDecodeInternalObject (ObjDesc->Reference.Object);
459a9643ea8Slogwang break;
460a9643ea8Slogwang
461a9643ea8Slogwang case ACPI_TYPE_PACKAGE:
462a9643ea8Slogwang
463a9643ea8Slogwang AcpiOsPrintf ("%p", ObjDesc->Reference.Where);
464a9643ea8Slogwang if (!ObjDesc->Reference.Where)
465a9643ea8Slogwang {
466a9643ea8Slogwang AcpiOsPrintf (" Uninitialized WHERE pointer");
467a9643ea8Slogwang }
468a9643ea8Slogwang else
469a9643ea8Slogwang {
470a9643ea8Slogwang AcpiDbDecodeInternalObject (
471a9643ea8Slogwang *(ObjDesc->Reference.Where));
472a9643ea8Slogwang }
473a9643ea8Slogwang break;
474a9643ea8Slogwang
475a9643ea8Slogwang default:
476a9643ea8Slogwang
477a9643ea8Slogwang AcpiOsPrintf ("Unknown index target type");
478a9643ea8Slogwang break;
479a9643ea8Slogwang }
480a9643ea8Slogwang break;
481a9643ea8Slogwang
482a9643ea8Slogwang case ACPI_REFCLASS_REFOF:
483a9643ea8Slogwang
484a9643ea8Slogwang if (!ObjDesc->Reference.Object)
485a9643ea8Slogwang {
486a9643ea8Slogwang AcpiOsPrintf (
487a9643ea8Slogwang "Uninitialized reference subobject pointer");
488a9643ea8Slogwang break;
489a9643ea8Slogwang }
490a9643ea8Slogwang
491a9643ea8Slogwang /* Reference can be to a Node or an Operand object */
492a9643ea8Slogwang
493a9643ea8Slogwang switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object))
494a9643ea8Slogwang {
495a9643ea8Slogwang case ACPI_DESC_TYPE_NAMED:
496a9643ea8Slogwang
497a9643ea8Slogwang AcpiDbDecodeNode (ObjDesc->Reference.Object);
498a9643ea8Slogwang break;
499a9643ea8Slogwang
500a9643ea8Slogwang case ACPI_DESC_TYPE_OPERAND:
501a9643ea8Slogwang
502a9643ea8Slogwang AcpiDbDecodeInternalObject (ObjDesc->Reference.Object);
503a9643ea8Slogwang break;
504a9643ea8Slogwang
505a9643ea8Slogwang default:
506a9643ea8Slogwang break;
507a9643ea8Slogwang }
508a9643ea8Slogwang break;
509a9643ea8Slogwang
510a9643ea8Slogwang case ACPI_REFCLASS_NAME:
511a9643ea8Slogwang
512a9643ea8Slogwang AcpiDbDecodeNode (ObjDesc->Reference.Node);
513a9643ea8Slogwang break;
514a9643ea8Slogwang
515a9643ea8Slogwang case ACPI_REFCLASS_DEBUG:
516a9643ea8Slogwang case ACPI_REFCLASS_TABLE:
517a9643ea8Slogwang
518a9643ea8Slogwang AcpiOsPrintf ("\n");
519a9643ea8Slogwang break;
520a9643ea8Slogwang
521a9643ea8Slogwang default: /* Unknown reference class */
522a9643ea8Slogwang
523a9643ea8Slogwang AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class);
524a9643ea8Slogwang break;
525a9643ea8Slogwang }
526a9643ea8Slogwang break;
527a9643ea8Slogwang
528a9643ea8Slogwang default:
529a9643ea8Slogwang
530a9643ea8Slogwang AcpiOsPrintf ("<Obj> ");
531a9643ea8Slogwang AcpiDbDecodeInternalObject (ObjDesc);
532a9643ea8Slogwang break;
533a9643ea8Slogwang }
534a9643ea8Slogwang break;
535a9643ea8Slogwang
536a9643ea8Slogwang default:
537a9643ea8Slogwang
538a9643ea8Slogwang AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]",
539a9643ea8Slogwang AcpiUtGetDescriptorName (ObjDesc));
540a9643ea8Slogwang break;
541a9643ea8Slogwang }
542a9643ea8Slogwang
543a9643ea8Slogwang AcpiOsPrintf ("\n");
544a9643ea8Slogwang }
545a9643ea8Slogwang
546a9643ea8Slogwang
547a9643ea8Slogwang /*******************************************************************************
548a9643ea8Slogwang *
549a9643ea8Slogwang * FUNCTION: AcpiDbDecodeLocals
550a9643ea8Slogwang *
551a9643ea8Slogwang * PARAMETERS: WalkState - State for current method
552a9643ea8Slogwang *
553a9643ea8Slogwang * RETURN: None
554a9643ea8Slogwang *
555a9643ea8Slogwang * DESCRIPTION: Display all locals for the currently running control method
556a9643ea8Slogwang *
557a9643ea8Slogwang ******************************************************************************/
558a9643ea8Slogwang
559a9643ea8Slogwang void
AcpiDbDecodeLocals(ACPI_WALK_STATE * WalkState)560a9643ea8Slogwang AcpiDbDecodeLocals (
561a9643ea8Slogwang ACPI_WALK_STATE *WalkState)
562a9643ea8Slogwang {
563a9643ea8Slogwang UINT32 i;
564a9643ea8Slogwang ACPI_OPERAND_OBJECT *ObjDesc;
565a9643ea8Slogwang ACPI_NAMESPACE_NODE *Node;
566a9643ea8Slogwang BOOLEAN DisplayLocals = FALSE;
567a9643ea8Slogwang
568a9643ea8Slogwang
569a9643ea8Slogwang Node = WalkState->MethodNode;
570a9643ea8Slogwang
571*22ce4affSfengbojiang /* There are no locals for the module-level code case */
572*22ce4affSfengbojiang
573*22ce4affSfengbojiang if (Node == AcpiGbl_RootNode)
574*22ce4affSfengbojiang {
575*22ce4affSfengbojiang return;
576*22ce4affSfengbojiang }
577*22ce4affSfengbojiang
578a9643ea8Slogwang if (!Node)
579a9643ea8Slogwang {
580a9643ea8Slogwang AcpiOsPrintf (
581a9643ea8Slogwang "No method node (Executing subtree for buffer or opregion)\n");
582a9643ea8Slogwang return;
583a9643ea8Slogwang }
584a9643ea8Slogwang
585a9643ea8Slogwang if (Node->Type != ACPI_TYPE_METHOD)
586a9643ea8Slogwang {
587a9643ea8Slogwang AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
588a9643ea8Slogwang return;
589a9643ea8Slogwang }
590a9643ea8Slogwang
591a9643ea8Slogwang /* Are any locals actually set? */
592a9643ea8Slogwang
593a9643ea8Slogwang for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
594a9643ea8Slogwang {
595a9643ea8Slogwang ObjDesc = WalkState->LocalVariables[i].Object;
596a9643ea8Slogwang if (ObjDesc)
597a9643ea8Slogwang {
598a9643ea8Slogwang DisplayLocals = TRUE;
599a9643ea8Slogwang break;
600a9643ea8Slogwang }
601a9643ea8Slogwang }
602a9643ea8Slogwang
603a9643ea8Slogwang /* If any are set, only display the ones that are set */
604a9643ea8Slogwang
605a9643ea8Slogwang if (DisplayLocals)
606a9643ea8Slogwang {
607*22ce4affSfengbojiang AcpiOsPrintf ("\nInitialized Local Variables for Method [%4.4s]:\n",
608a9643ea8Slogwang AcpiUtGetNodeName (Node));
609a9643ea8Slogwang
610a9643ea8Slogwang for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
611a9643ea8Slogwang {
612a9643ea8Slogwang ObjDesc = WalkState->LocalVariables[i].Object;
613a9643ea8Slogwang if (ObjDesc)
614a9643ea8Slogwang {
615a9643ea8Slogwang AcpiOsPrintf (" Local%X: ", i);
616a9643ea8Slogwang AcpiDbDisplayInternalObject (ObjDesc, WalkState);
617a9643ea8Slogwang }
618a9643ea8Slogwang }
619a9643ea8Slogwang }
620a9643ea8Slogwang else
621a9643ea8Slogwang {
622a9643ea8Slogwang AcpiOsPrintf (
623*22ce4affSfengbojiang "No Local Variables are initialized for Method [%4.4s]\n",
624a9643ea8Slogwang AcpiUtGetNodeName (Node));
625a9643ea8Slogwang }
626a9643ea8Slogwang }
627a9643ea8Slogwang
628a9643ea8Slogwang
629a9643ea8Slogwang /*******************************************************************************
630a9643ea8Slogwang *
631a9643ea8Slogwang * FUNCTION: AcpiDbDecodeArguments
632a9643ea8Slogwang *
633a9643ea8Slogwang * PARAMETERS: WalkState - State for current method
634a9643ea8Slogwang *
635a9643ea8Slogwang * RETURN: None
636a9643ea8Slogwang *
637a9643ea8Slogwang * DESCRIPTION: Display all arguments for the currently running control method
638a9643ea8Slogwang *
639a9643ea8Slogwang ******************************************************************************/
640a9643ea8Slogwang
641a9643ea8Slogwang void
AcpiDbDecodeArguments(ACPI_WALK_STATE * WalkState)642a9643ea8Slogwang AcpiDbDecodeArguments (
643a9643ea8Slogwang ACPI_WALK_STATE *WalkState)
644a9643ea8Slogwang {
645a9643ea8Slogwang UINT32 i;
646a9643ea8Slogwang ACPI_OPERAND_OBJECT *ObjDesc;
647a9643ea8Slogwang ACPI_NAMESPACE_NODE *Node;
648a9643ea8Slogwang BOOLEAN DisplayArgs = FALSE;
649a9643ea8Slogwang
650a9643ea8Slogwang
651a9643ea8Slogwang Node = WalkState->MethodNode;
652*22ce4affSfengbojiang
653*22ce4affSfengbojiang /* There are no arguments for the module-level code case */
654*22ce4affSfengbojiang
655*22ce4affSfengbojiang if (Node == AcpiGbl_RootNode)
656*22ce4affSfengbojiang {
657*22ce4affSfengbojiang return;
658*22ce4affSfengbojiang }
659a9643ea8Slogwang
660a9643ea8Slogwang if (!Node)
661a9643ea8Slogwang {
662a9643ea8Slogwang AcpiOsPrintf (
663a9643ea8Slogwang "No method node (Executing subtree for buffer or opregion)\n");
664a9643ea8Slogwang return;
665a9643ea8Slogwang }
666a9643ea8Slogwang
667a9643ea8Slogwang if (Node->Type != ACPI_TYPE_METHOD)
668a9643ea8Slogwang {
669a9643ea8Slogwang AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
670a9643ea8Slogwang return;
671a9643ea8Slogwang }
672a9643ea8Slogwang
673a9643ea8Slogwang /* Are any arguments actually set? */
674a9643ea8Slogwang
675a9643ea8Slogwang for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
676a9643ea8Slogwang {
677a9643ea8Slogwang ObjDesc = WalkState->Arguments[i].Object;
678a9643ea8Slogwang if (ObjDesc)
679a9643ea8Slogwang {
680a9643ea8Slogwang DisplayArgs = TRUE;
681a9643ea8Slogwang break;
682a9643ea8Slogwang }
683a9643ea8Slogwang }
684a9643ea8Slogwang
685a9643ea8Slogwang /* If any are set, only display the ones that are set */
686a9643ea8Slogwang
687a9643ea8Slogwang if (DisplayArgs)
688a9643ea8Slogwang {
689a9643ea8Slogwang AcpiOsPrintf (
690a9643ea8Slogwang "Initialized Arguments for Method [%4.4s]: "
691a9643ea8Slogwang "(%X arguments defined for method invocation)\n",
692*22ce4affSfengbojiang AcpiUtGetNodeName (Node), Node->Object->Method.ParamCount);
693a9643ea8Slogwang
694a9643ea8Slogwang for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
695a9643ea8Slogwang {
696a9643ea8Slogwang ObjDesc = WalkState->Arguments[i].Object;
697a9643ea8Slogwang if (ObjDesc)
698a9643ea8Slogwang {
699a9643ea8Slogwang AcpiOsPrintf (" Arg%u: ", i);
700a9643ea8Slogwang AcpiDbDisplayInternalObject (ObjDesc, WalkState);
701a9643ea8Slogwang }
702a9643ea8Slogwang }
703a9643ea8Slogwang }
704a9643ea8Slogwang else
705a9643ea8Slogwang {
706a9643ea8Slogwang AcpiOsPrintf (
707a9643ea8Slogwang "No Arguments are initialized for method [%4.4s]\n",
708a9643ea8Slogwang AcpiUtGetNodeName (Node));
709a9643ea8Slogwang }
710a9643ea8Slogwang }
711