1 /******************************************************************************
3 * Module Name: dsdebug - Parser/Interpreter interface - debugging
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2016, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
52 #define _COMPONENT ACPI_DISPATCHER
53 ACPI_MODULE_NAME ("dsdebug")
56 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
58 /* Local prototypes */
61 AcpiDsPrintNodePathname (
62 ACPI_NAMESPACE_NODE
*Node
,
66 /*******************************************************************************
68 * FUNCTION: AcpiDsPrintNodePathname
70 * PARAMETERS: Node - Object
71 * Message - Prefix message
73 * DESCRIPTION: Print an object's full namespace pathname
74 * Manages allocation/freeing of a pathname buffer
76 ******************************************************************************/
79 AcpiDsPrintNodePathname (
80 ACPI_NAMESPACE_NODE
*Node
,
87 ACPI_FUNCTION_TRACE (DsPrintNodePathname
);
91 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
, "[NULL NAME]"));
95 /* Convert handle to full pathname and print it (with supplied message) */
97 Buffer
.Length
= ACPI_ALLOCATE_LOCAL_BUFFER
;
99 Status
= AcpiNsHandleToPathname (Node
, &Buffer
, TRUE
);
100 if (ACPI_SUCCESS (Status
))
104 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
, "%s ", Message
));
107 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
, "[%s] (Node %p)",
108 (char *) Buffer
.Pointer
, Node
));
109 ACPI_FREE (Buffer
.Pointer
);
116 /*******************************************************************************
118 * FUNCTION: AcpiDsDumpMethodStack
120 * PARAMETERS: Status - Method execution status
121 * WalkState - Current state of the parse tree walk
122 * Op - Executing parse op
126 * DESCRIPTION: Called when a method has been aborted because of an error.
127 * Dumps the method execution stack.
129 ******************************************************************************/
132 AcpiDsDumpMethodStack (
134 ACPI_WALK_STATE
*WalkState
,
135 ACPI_PARSE_OBJECT
*Op
)
137 ACPI_PARSE_OBJECT
*Next
;
138 ACPI_THREAD_STATE
*Thread
;
139 ACPI_WALK_STATE
*NextWalkState
;
140 ACPI_NAMESPACE_NODE
*PreviousMethod
= NULL
;
141 ACPI_OPERAND_OBJECT
*MethodDesc
;
144 ACPI_FUNCTION_TRACE (DsDumpMethodStack
);
146 /* Ignore control codes, they are not errors */
148 if ((Status
& AE_CODE_MASK
) == AE_CODE_CONTROL
)
153 /* We may be executing a deferred opcode */
155 if (WalkState
->DeferredNode
)
157 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
,
158 "Executing subtree for Buffer/Package/Region\n"));
163 * If there is no Thread, we are not actually executing a method.
164 * This can happen when the iASL compiler calls the interpreter
165 * to perform constant folding.
167 Thread
= WalkState
->Thread
;
173 /* Display exception and method name */
175 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
,
176 "\n**** Exception %s during execution of method ",
177 AcpiFormatException (Status
)));
179 AcpiDsPrintNodePathname (WalkState
->MethodNode
, NULL
);
181 /* Display stack of executing methods */
183 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
,
184 "\n\nMethod Execution Stack:\n"));
185 NextWalkState
= Thread
->WalkStateList
;
187 /* Walk list of linked walk states */
189 while (NextWalkState
)
191 MethodDesc
= NextWalkState
->MethodDesc
;
194 AcpiExStopTraceMethod (
195 (ACPI_NAMESPACE_NODE
*) MethodDesc
->Method
.Node
,
196 MethodDesc
, WalkState
);
199 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH
,
200 " Method [%4.4s] executing: ",
201 AcpiUtGetNodeName (NextWalkState
->MethodNode
)));
203 /* First method is the currently executing method */
205 if (NextWalkState
== WalkState
)
209 /* Display currently executing ASL statement */
211 Next
= Op
->Common
.Next
;
212 Op
->Common
.Next
= NULL
;
214 #ifdef ACPI_DISASSEMBLER
215 AcpiDmDisassemble (NextWalkState
, Op
, ACPI_UINT32_MAX
);
217 Op
->Common
.Next
= Next
;
223 * This method has called another method
224 * NOTE: the method call parse subtree is already deleted at
225 * this point, so we cannot disassemble the method invocation.
227 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
, "Call to method "));
228 AcpiDsPrintNodePathname (PreviousMethod
, NULL
);
231 PreviousMethod
= NextWalkState
->MethodNode
;
232 NextWalkState
= NextWalkState
->Next
;
233 ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH
, "\n"));
242 AcpiDsDumpMethodStack (
244 ACPI_WALK_STATE
*WalkState
,
245 ACPI_PARSE_OBJECT
*Op
)