1 /******************************************************************************
3 * Module Name: extrace - Support for interpreter execution tracing
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.
50 #define _COMPONENT ACPI_EXECUTER
51 ACPI_MODULE_NAME ("extrace")
54 static ACPI_OPERAND_OBJECT
*AcpiGbl_TraceMethodObject
= NULL
;
56 /* Local prototypes */
58 #ifdef ACPI_DEBUG_OUTPUT
60 AcpiExGetTraceEventName (
61 ACPI_TRACE_EVENT_TYPE Type
);
65 /*******************************************************************************
67 * FUNCTION: AcpiExInterpreterTraceEnabled
69 * PARAMETERS: Name - Whether method name should be matched,
70 * this should be checked before starting
73 * RETURN: TRUE if interpreter trace is enabled.
75 * DESCRIPTION: Check whether interpreter trace is enabled
77 ******************************************************************************/
80 AcpiExInterpreterTraceEnabled (
84 /* Check if tracing is enabled */
86 if (!(AcpiGbl_TraceFlags
& ACPI_TRACE_ENABLED
))
92 * Check if tracing is filtered:
94 * 1. If the tracer is started, AcpiGbl_TraceMethodObject should have
95 * been filled by the trace starter
96 * 2. If the tracer is not started, AcpiGbl_TraceMethodName should be
97 * matched if it is specified
98 * 3. If the tracer is oneshot style, AcpiGbl_TraceMethodName should
99 * not be cleared by the trace stopper during the first match
101 if (AcpiGbl_TraceMethodObject
)
107 (AcpiGbl_TraceMethodName
&&
108 strcmp (AcpiGbl_TraceMethodName
, Name
)))
113 if ((AcpiGbl_TraceFlags
& ACPI_TRACE_ONESHOT
) &&
114 !AcpiGbl_TraceMethodName
)
123 /*******************************************************************************
125 * FUNCTION: AcpiExGetTraceEventName
127 * PARAMETERS: Type - Trace event type
129 * RETURN: Trace event name.
131 * DESCRIPTION: Used to obtain the full trace event name.
133 ******************************************************************************/
135 #ifdef ACPI_DEBUG_OUTPUT
138 AcpiExGetTraceEventName (
139 ACPI_TRACE_EVENT_TYPE Type
)
144 case ACPI_TRACE_AML_METHOD
:
148 case ACPI_TRACE_AML_OPCODE
:
152 case ACPI_TRACE_AML_REGION
:
165 /*******************************************************************************
167 * FUNCTION: AcpiExTracePoint
169 * PARAMETERS: Type - Trace event type
170 * Begin - TRUE if before execution
171 * Aml - Executed AML address
172 * Pathname - Object path
176 * DESCRIPTION: Internal interpreter execution trace.
178 ******************************************************************************/
182 ACPI_TRACE_EVENT_TYPE Type
,
188 ACPI_FUNCTION_NAME (ExTracePoint
);
193 ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT
,
194 "%s %s [0x%p:%s] execution.\n",
195 AcpiExGetTraceEventName (Type
), Begin
? "Begin" : "End",
200 ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT
,
201 "%s %s [0x%p] execution.\n",
202 AcpiExGetTraceEventName (Type
), Begin
? "Begin" : "End",
208 /*******************************************************************************
210 * FUNCTION: AcpiExStartTraceMethod
212 * PARAMETERS: MethodNode - Node of the method
213 * ObjDesc - The method object
214 * WalkState - current state, NULL if not yet executing
219 * DESCRIPTION: Start control method execution trace
221 ******************************************************************************/
224 AcpiExStartTraceMethod (
225 ACPI_NAMESPACE_NODE
*MethodNode
,
226 ACPI_OPERAND_OBJECT
*ObjDesc
,
227 ACPI_WALK_STATE
*WalkState
)
230 char *Pathname
= NULL
;
231 BOOLEAN Enabled
= FALSE
;
234 ACPI_FUNCTION_NAME (ExStartTraceMethod
);
239 Pathname
= AcpiNsGetNormalizedPathname (MethodNode
, TRUE
);
242 Status
= AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE
);
243 if (ACPI_FAILURE (Status
))
248 Enabled
= AcpiExInterpreterTraceEnabled (Pathname
);
249 if (Enabled
&& !AcpiGbl_TraceMethodObject
)
251 AcpiGbl_TraceMethodObject
= ObjDesc
;
252 AcpiGbl_OriginalDbgLevel
= AcpiDbgLevel
;
253 AcpiGbl_OriginalDbgLayer
= AcpiDbgLayer
;
254 AcpiDbgLevel
= ACPI_TRACE_LEVEL_ALL
;
255 AcpiDbgLayer
= ACPI_TRACE_LAYER_ALL
;
257 if (AcpiGbl_TraceDbgLevel
)
259 AcpiDbgLevel
= AcpiGbl_TraceDbgLevel
;
262 if (AcpiGbl_TraceDbgLayer
)
264 AcpiDbgLayer
= AcpiGbl_TraceDbgLayer
;
268 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE
);
273 ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD
, TRUE
,
274 ObjDesc
? ObjDesc
->Method
.AmlStart
: NULL
, Pathname
);
279 ACPI_FREE (Pathname
);
284 /*******************************************************************************
286 * FUNCTION: AcpiExStopTraceMethod
288 * PARAMETERS: MethodNode - Node of the method
289 * ObjDesc - The method object
290 * WalkState - current state, NULL if not yet executing
295 * DESCRIPTION: Stop control method execution trace
297 ******************************************************************************/
300 AcpiExStopTraceMethod (
301 ACPI_NAMESPACE_NODE
*MethodNode
,
302 ACPI_OPERAND_OBJECT
*ObjDesc
,
303 ACPI_WALK_STATE
*WalkState
)
306 char *Pathname
= NULL
;
310 ACPI_FUNCTION_NAME (ExStopTraceMethod
);
315 Pathname
= AcpiNsGetNormalizedPathname (MethodNode
, TRUE
);
318 Status
= AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE
);
319 if (ACPI_FAILURE (Status
))
324 Enabled
= AcpiExInterpreterTraceEnabled (NULL
);
326 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE
);
330 ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD
, FALSE
,
331 ObjDesc
? ObjDesc
->Method
.AmlStart
: NULL
, Pathname
);
334 Status
= AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE
);
335 if (ACPI_FAILURE (Status
))
340 /* Check whether the tracer should be stopped */
342 if (AcpiGbl_TraceMethodObject
== ObjDesc
)
344 /* Disable further tracing if type is one-shot */
346 if (AcpiGbl_TraceFlags
& ACPI_TRACE_ONESHOT
)
348 AcpiGbl_TraceMethodName
= NULL
;
351 AcpiDbgLevel
= AcpiGbl_OriginalDbgLevel
;
352 AcpiDbgLayer
= AcpiGbl_OriginalDbgLayer
;
353 AcpiGbl_TraceMethodObject
= NULL
;
356 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE
);
361 ACPI_FREE (Pathname
);
366 /*******************************************************************************
368 * FUNCTION: AcpiExStartTraceOpcode
370 * PARAMETERS: Op - The parser opcode object
371 * WalkState - current state, NULL if not yet executing
376 * DESCRIPTION: Start opcode execution trace
378 ******************************************************************************/
381 AcpiExStartTraceOpcode (
382 ACPI_PARSE_OBJECT
*Op
,
383 ACPI_WALK_STATE
*WalkState
)
386 ACPI_FUNCTION_NAME (ExStartTraceOpcode
);
389 if (AcpiExInterpreterTraceEnabled (NULL
) &&
390 (AcpiGbl_TraceFlags
& ACPI_TRACE_OPCODE
))
392 ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE
, TRUE
,
393 Op
->Common
.Aml
, Op
->Common
.AmlOpName
);
398 /*******************************************************************************
400 * FUNCTION: AcpiExStopTraceOpcode
402 * PARAMETERS: Op - The parser opcode object
403 * WalkState - current state, NULL if not yet executing
408 * DESCRIPTION: Stop opcode execution trace
410 ******************************************************************************/
413 AcpiExStopTraceOpcode (
414 ACPI_PARSE_OBJECT
*Op
,
415 ACPI_WALK_STATE
*WalkState
)
418 ACPI_FUNCTION_NAME (ExStopTraceOpcode
);
421 if (AcpiExInterpreterTraceEnabled (NULL
) &&
422 (AcpiGbl_TraceFlags
& ACPI_TRACE_OPCODE
))
424 ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE
, FALSE
,
425 Op
->Common
.Aml
, Op
->Common
.AmlOpName
);