1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek *
3*385cc6b4SJerry Jelinek * Module Name: extrace - Support for interpreter execution tracing
4*385cc6b4SJerry Jelinek *
5*385cc6b4SJerry Jelinek *****************************************************************************/
6*385cc6b4SJerry Jelinek
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek * All rights reserved.
10*385cc6b4SJerry Jelinek *
11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek * are met:
14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek * without modification.
17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek * binary redistribution.
22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek * from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek *
26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek * Software Foundation.
29*385cc6b4SJerry Jelinek *
30*385cc6b4SJerry Jelinek * NO WARRANTY
31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek */
43*385cc6b4SJerry Jelinek
44*385cc6b4SJerry Jelinek #include "acpi.h"
45*385cc6b4SJerry Jelinek #include "accommon.h"
46*385cc6b4SJerry Jelinek #include "acnamesp.h"
47*385cc6b4SJerry Jelinek #include "acinterp.h"
48*385cc6b4SJerry Jelinek
49*385cc6b4SJerry Jelinek
50*385cc6b4SJerry Jelinek #define _COMPONENT ACPI_EXECUTER
51*385cc6b4SJerry Jelinek ACPI_MODULE_NAME ("extrace")
52*385cc6b4SJerry Jelinek
53*385cc6b4SJerry Jelinek
54*385cc6b4SJerry Jelinek static ACPI_OPERAND_OBJECT *AcpiGbl_TraceMethodObject = NULL;
55*385cc6b4SJerry Jelinek
56*385cc6b4SJerry Jelinek /* Local prototypes */
57*385cc6b4SJerry Jelinek
58*385cc6b4SJerry Jelinek #ifdef ACPI_DEBUG_OUTPUT
59*385cc6b4SJerry Jelinek static const char *
60*385cc6b4SJerry Jelinek AcpiExGetTraceEventName (
61*385cc6b4SJerry Jelinek ACPI_TRACE_EVENT_TYPE Type);
62*385cc6b4SJerry Jelinek #endif
63*385cc6b4SJerry Jelinek
64*385cc6b4SJerry Jelinek
65*385cc6b4SJerry Jelinek /*******************************************************************************
66*385cc6b4SJerry Jelinek *
67*385cc6b4SJerry Jelinek * FUNCTION: AcpiExInterpreterTraceEnabled
68*385cc6b4SJerry Jelinek *
69*385cc6b4SJerry Jelinek * PARAMETERS: Name - Whether method name should be matched,
70*385cc6b4SJerry Jelinek * this should be checked before starting
71*385cc6b4SJerry Jelinek * the tracer
72*385cc6b4SJerry Jelinek *
73*385cc6b4SJerry Jelinek * RETURN: TRUE if interpreter trace is enabled.
74*385cc6b4SJerry Jelinek *
75*385cc6b4SJerry Jelinek * DESCRIPTION: Check whether interpreter trace is enabled
76*385cc6b4SJerry Jelinek *
77*385cc6b4SJerry Jelinek ******************************************************************************/
78*385cc6b4SJerry Jelinek
79*385cc6b4SJerry Jelinek static BOOLEAN
AcpiExInterpreterTraceEnabled(char * Name)80*385cc6b4SJerry Jelinek AcpiExInterpreterTraceEnabled (
81*385cc6b4SJerry Jelinek char *Name)
82*385cc6b4SJerry Jelinek {
83*385cc6b4SJerry Jelinek
84*385cc6b4SJerry Jelinek /* Check if tracing is enabled */
85*385cc6b4SJerry Jelinek
86*385cc6b4SJerry Jelinek if (!(AcpiGbl_TraceFlags & ACPI_TRACE_ENABLED))
87*385cc6b4SJerry Jelinek {
88*385cc6b4SJerry Jelinek return (FALSE);
89*385cc6b4SJerry Jelinek }
90*385cc6b4SJerry Jelinek
91*385cc6b4SJerry Jelinek /*
92*385cc6b4SJerry Jelinek * Check if tracing is filtered:
93*385cc6b4SJerry Jelinek *
94*385cc6b4SJerry Jelinek * 1. If the tracer is started, AcpiGbl_TraceMethodObject should have
95*385cc6b4SJerry Jelinek * been filled by the trace starter
96*385cc6b4SJerry Jelinek * 2. If the tracer is not started, AcpiGbl_TraceMethodName should be
97*385cc6b4SJerry Jelinek * matched if it is specified
98*385cc6b4SJerry Jelinek * 3. If the tracer is oneshot style, AcpiGbl_TraceMethodName should
99*385cc6b4SJerry Jelinek * not be cleared by the trace stopper during the first match
100*385cc6b4SJerry Jelinek */
101*385cc6b4SJerry Jelinek if (AcpiGbl_TraceMethodObject)
102*385cc6b4SJerry Jelinek {
103*385cc6b4SJerry Jelinek return (TRUE);
104*385cc6b4SJerry Jelinek }
105*385cc6b4SJerry Jelinek
106*385cc6b4SJerry Jelinek if (Name &&
107*385cc6b4SJerry Jelinek (AcpiGbl_TraceMethodName &&
108*385cc6b4SJerry Jelinek strcmp (AcpiGbl_TraceMethodName, Name)))
109*385cc6b4SJerry Jelinek {
110*385cc6b4SJerry Jelinek return (FALSE);
111*385cc6b4SJerry Jelinek }
112*385cc6b4SJerry Jelinek
113*385cc6b4SJerry Jelinek if ((AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT) &&
114*385cc6b4SJerry Jelinek !AcpiGbl_TraceMethodName)
115*385cc6b4SJerry Jelinek {
116*385cc6b4SJerry Jelinek return (FALSE);
117*385cc6b4SJerry Jelinek }
118*385cc6b4SJerry Jelinek
119*385cc6b4SJerry Jelinek return (TRUE);
120*385cc6b4SJerry Jelinek }
121*385cc6b4SJerry Jelinek
122*385cc6b4SJerry Jelinek
123*385cc6b4SJerry Jelinek /*******************************************************************************
124*385cc6b4SJerry Jelinek *
125*385cc6b4SJerry Jelinek * FUNCTION: AcpiExGetTraceEventName
126*385cc6b4SJerry Jelinek *
127*385cc6b4SJerry Jelinek * PARAMETERS: Type - Trace event type
128*385cc6b4SJerry Jelinek *
129*385cc6b4SJerry Jelinek * RETURN: Trace event name.
130*385cc6b4SJerry Jelinek *
131*385cc6b4SJerry Jelinek * DESCRIPTION: Used to obtain the full trace event name.
132*385cc6b4SJerry Jelinek *
133*385cc6b4SJerry Jelinek ******************************************************************************/
134*385cc6b4SJerry Jelinek
135*385cc6b4SJerry Jelinek #ifdef ACPI_DEBUG_OUTPUT
136*385cc6b4SJerry Jelinek
137*385cc6b4SJerry Jelinek static const char *
AcpiExGetTraceEventName(ACPI_TRACE_EVENT_TYPE Type)138*385cc6b4SJerry Jelinek AcpiExGetTraceEventName (
139*385cc6b4SJerry Jelinek ACPI_TRACE_EVENT_TYPE Type)
140*385cc6b4SJerry Jelinek {
141*385cc6b4SJerry Jelinek
142*385cc6b4SJerry Jelinek switch (Type)
143*385cc6b4SJerry Jelinek {
144*385cc6b4SJerry Jelinek case ACPI_TRACE_AML_METHOD:
145*385cc6b4SJerry Jelinek
146*385cc6b4SJerry Jelinek return "Method";
147*385cc6b4SJerry Jelinek
148*385cc6b4SJerry Jelinek case ACPI_TRACE_AML_OPCODE:
149*385cc6b4SJerry Jelinek
150*385cc6b4SJerry Jelinek return "Opcode";
151*385cc6b4SJerry Jelinek
152*385cc6b4SJerry Jelinek case ACPI_TRACE_AML_REGION:
153*385cc6b4SJerry Jelinek
154*385cc6b4SJerry Jelinek return "Region";
155*385cc6b4SJerry Jelinek
156*385cc6b4SJerry Jelinek default:
157*385cc6b4SJerry Jelinek
158*385cc6b4SJerry Jelinek return "";
159*385cc6b4SJerry Jelinek }
160*385cc6b4SJerry Jelinek }
161*385cc6b4SJerry Jelinek
162*385cc6b4SJerry Jelinek #endif
163*385cc6b4SJerry Jelinek
164*385cc6b4SJerry Jelinek
165*385cc6b4SJerry Jelinek /*******************************************************************************
166*385cc6b4SJerry Jelinek *
167*385cc6b4SJerry Jelinek * FUNCTION: AcpiExTracePoint
168*385cc6b4SJerry Jelinek *
169*385cc6b4SJerry Jelinek * PARAMETERS: Type - Trace event type
170*385cc6b4SJerry Jelinek * Begin - TRUE if before execution
171*385cc6b4SJerry Jelinek * Aml - Executed AML address
172*385cc6b4SJerry Jelinek * Pathname - Object path
173*385cc6b4SJerry Jelinek *
174*385cc6b4SJerry Jelinek * RETURN: None
175*385cc6b4SJerry Jelinek *
176*385cc6b4SJerry Jelinek * DESCRIPTION: Internal interpreter execution trace.
177*385cc6b4SJerry Jelinek *
178*385cc6b4SJerry Jelinek ******************************************************************************/
179*385cc6b4SJerry Jelinek
180*385cc6b4SJerry Jelinek void
AcpiExTracePoint(ACPI_TRACE_EVENT_TYPE Type,BOOLEAN Begin,UINT8 * Aml,char * Pathname)181*385cc6b4SJerry Jelinek AcpiExTracePoint (
182*385cc6b4SJerry Jelinek ACPI_TRACE_EVENT_TYPE Type,
183*385cc6b4SJerry Jelinek BOOLEAN Begin,
184*385cc6b4SJerry Jelinek UINT8 *Aml,
185*385cc6b4SJerry Jelinek char *Pathname)
186*385cc6b4SJerry Jelinek {
187*385cc6b4SJerry Jelinek
188*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (ExTracePoint);
189*385cc6b4SJerry Jelinek
190*385cc6b4SJerry Jelinek
191*385cc6b4SJerry Jelinek if (Pathname)
192*385cc6b4SJerry Jelinek {
193*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
194*385cc6b4SJerry Jelinek "%s %s [0x%p:%s] execution.\n",
195*385cc6b4SJerry Jelinek AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
196*385cc6b4SJerry Jelinek Aml, Pathname));
197*385cc6b4SJerry Jelinek }
198*385cc6b4SJerry Jelinek else
199*385cc6b4SJerry Jelinek {
200*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_TRACE_POINT,
201*385cc6b4SJerry Jelinek "%s %s [0x%p] execution.\n",
202*385cc6b4SJerry Jelinek AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
203*385cc6b4SJerry Jelinek Aml));
204*385cc6b4SJerry Jelinek }
205*385cc6b4SJerry Jelinek }
206*385cc6b4SJerry Jelinek
207*385cc6b4SJerry Jelinek
208*385cc6b4SJerry Jelinek /*******************************************************************************
209*385cc6b4SJerry Jelinek *
210*385cc6b4SJerry Jelinek * FUNCTION: AcpiExStartTraceMethod
211*385cc6b4SJerry Jelinek *
212*385cc6b4SJerry Jelinek * PARAMETERS: MethodNode - Node of the method
213*385cc6b4SJerry Jelinek * ObjDesc - The method object
214*385cc6b4SJerry Jelinek * WalkState - current state, NULL if not yet executing
215*385cc6b4SJerry Jelinek * a method.
216*385cc6b4SJerry Jelinek *
217*385cc6b4SJerry Jelinek * RETURN: None
218*385cc6b4SJerry Jelinek *
219*385cc6b4SJerry Jelinek * DESCRIPTION: Start control method execution trace
220*385cc6b4SJerry Jelinek *
221*385cc6b4SJerry Jelinek ******************************************************************************/
222*385cc6b4SJerry Jelinek
223*385cc6b4SJerry Jelinek void
AcpiExStartTraceMethod(ACPI_NAMESPACE_NODE * MethodNode,ACPI_OPERAND_OBJECT * ObjDesc,ACPI_WALK_STATE * WalkState)224*385cc6b4SJerry Jelinek AcpiExStartTraceMethod (
225*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *MethodNode,
226*385cc6b4SJerry Jelinek ACPI_OPERAND_OBJECT *ObjDesc,
227*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState)
228*385cc6b4SJerry Jelinek {
229*385cc6b4SJerry Jelinek ACPI_STATUS Status;
230*385cc6b4SJerry Jelinek char *Pathname = NULL;
231*385cc6b4SJerry Jelinek BOOLEAN Enabled = FALSE;
232*385cc6b4SJerry Jelinek
233*385cc6b4SJerry Jelinek
234*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (ExStartTraceMethod);
235*385cc6b4SJerry Jelinek
236*385cc6b4SJerry Jelinek
237*385cc6b4SJerry Jelinek if (MethodNode)
238*385cc6b4SJerry Jelinek {
239*385cc6b4SJerry Jelinek Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
240*385cc6b4SJerry Jelinek }
241*385cc6b4SJerry Jelinek
242*385cc6b4SJerry Jelinek Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
243*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
244*385cc6b4SJerry Jelinek {
245*385cc6b4SJerry Jelinek goto Exit;
246*385cc6b4SJerry Jelinek }
247*385cc6b4SJerry Jelinek
248*385cc6b4SJerry Jelinek Enabled = AcpiExInterpreterTraceEnabled (Pathname);
249*385cc6b4SJerry Jelinek if (Enabled && !AcpiGbl_TraceMethodObject)
250*385cc6b4SJerry Jelinek {
251*385cc6b4SJerry Jelinek AcpiGbl_TraceMethodObject = ObjDesc;
252*385cc6b4SJerry Jelinek AcpiGbl_OriginalDbgLevel = AcpiDbgLevel;
253*385cc6b4SJerry Jelinek AcpiGbl_OriginalDbgLayer = AcpiDbgLayer;
254*385cc6b4SJerry Jelinek AcpiDbgLevel = ACPI_TRACE_LEVEL_ALL;
255*385cc6b4SJerry Jelinek AcpiDbgLayer = ACPI_TRACE_LAYER_ALL;
256*385cc6b4SJerry Jelinek
257*385cc6b4SJerry Jelinek if (AcpiGbl_TraceDbgLevel)
258*385cc6b4SJerry Jelinek {
259*385cc6b4SJerry Jelinek AcpiDbgLevel = AcpiGbl_TraceDbgLevel;
260*385cc6b4SJerry Jelinek }
261*385cc6b4SJerry Jelinek
262*385cc6b4SJerry Jelinek if (AcpiGbl_TraceDbgLayer)
263*385cc6b4SJerry Jelinek {
264*385cc6b4SJerry Jelinek AcpiDbgLayer = AcpiGbl_TraceDbgLayer;
265*385cc6b4SJerry Jelinek }
266*385cc6b4SJerry Jelinek }
267*385cc6b4SJerry Jelinek
268*385cc6b4SJerry Jelinek (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
269*385cc6b4SJerry Jelinek
270*385cc6b4SJerry Jelinek Exit:
271*385cc6b4SJerry Jelinek if (Enabled)
272*385cc6b4SJerry Jelinek {
273*385cc6b4SJerry Jelinek ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, TRUE,
274*385cc6b4SJerry Jelinek ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
275*385cc6b4SJerry Jelinek }
276*385cc6b4SJerry Jelinek
277*385cc6b4SJerry Jelinek if (Pathname)
278*385cc6b4SJerry Jelinek {
279*385cc6b4SJerry Jelinek ACPI_FREE (Pathname);
280*385cc6b4SJerry Jelinek }
281*385cc6b4SJerry Jelinek }
282*385cc6b4SJerry Jelinek
283*385cc6b4SJerry Jelinek
284*385cc6b4SJerry Jelinek /*******************************************************************************
285*385cc6b4SJerry Jelinek *
286*385cc6b4SJerry Jelinek * FUNCTION: AcpiExStopTraceMethod
287*385cc6b4SJerry Jelinek *
288*385cc6b4SJerry Jelinek * PARAMETERS: MethodNode - Node of the method
289*385cc6b4SJerry Jelinek * ObjDesc - The method object
290*385cc6b4SJerry Jelinek * WalkState - current state, NULL if not yet executing
291*385cc6b4SJerry Jelinek * a method.
292*385cc6b4SJerry Jelinek *
293*385cc6b4SJerry Jelinek * RETURN: None
294*385cc6b4SJerry Jelinek *
295*385cc6b4SJerry Jelinek * DESCRIPTION: Stop control method execution trace
296*385cc6b4SJerry Jelinek *
297*385cc6b4SJerry Jelinek ******************************************************************************/
298*385cc6b4SJerry Jelinek
299*385cc6b4SJerry Jelinek void
AcpiExStopTraceMethod(ACPI_NAMESPACE_NODE * MethodNode,ACPI_OPERAND_OBJECT * ObjDesc,ACPI_WALK_STATE * WalkState)300*385cc6b4SJerry Jelinek AcpiExStopTraceMethod (
301*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *MethodNode,
302*385cc6b4SJerry Jelinek ACPI_OPERAND_OBJECT *ObjDesc,
303*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState)
304*385cc6b4SJerry Jelinek {
305*385cc6b4SJerry Jelinek ACPI_STATUS Status;
306*385cc6b4SJerry Jelinek char *Pathname = NULL;
307*385cc6b4SJerry Jelinek BOOLEAN Enabled;
308*385cc6b4SJerry Jelinek
309*385cc6b4SJerry Jelinek
310*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (ExStopTraceMethod);
311*385cc6b4SJerry Jelinek
312*385cc6b4SJerry Jelinek
313*385cc6b4SJerry Jelinek if (MethodNode)
314*385cc6b4SJerry Jelinek {
315*385cc6b4SJerry Jelinek Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
316*385cc6b4SJerry Jelinek }
317*385cc6b4SJerry Jelinek
318*385cc6b4SJerry Jelinek Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
319*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
320*385cc6b4SJerry Jelinek {
321*385cc6b4SJerry Jelinek goto ExitPath;
322*385cc6b4SJerry Jelinek }
323*385cc6b4SJerry Jelinek
324*385cc6b4SJerry Jelinek Enabled = AcpiExInterpreterTraceEnabled (NULL);
325*385cc6b4SJerry Jelinek
326*385cc6b4SJerry Jelinek (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
327*385cc6b4SJerry Jelinek
328*385cc6b4SJerry Jelinek if (Enabled)
329*385cc6b4SJerry Jelinek {
330*385cc6b4SJerry Jelinek ACPI_TRACE_POINT (ACPI_TRACE_AML_METHOD, FALSE,
331*385cc6b4SJerry Jelinek ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
332*385cc6b4SJerry Jelinek }
333*385cc6b4SJerry Jelinek
334*385cc6b4SJerry Jelinek Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
335*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
336*385cc6b4SJerry Jelinek {
337*385cc6b4SJerry Jelinek goto ExitPath;
338*385cc6b4SJerry Jelinek }
339*385cc6b4SJerry Jelinek
340*385cc6b4SJerry Jelinek /* Check whether the tracer should be stopped */
341*385cc6b4SJerry Jelinek
342*385cc6b4SJerry Jelinek if (AcpiGbl_TraceMethodObject == ObjDesc)
343*385cc6b4SJerry Jelinek {
344*385cc6b4SJerry Jelinek /* Disable further tracing if type is one-shot */
345*385cc6b4SJerry Jelinek
346*385cc6b4SJerry Jelinek if (AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT)
347*385cc6b4SJerry Jelinek {
348*385cc6b4SJerry Jelinek AcpiGbl_TraceMethodName = NULL;
349*385cc6b4SJerry Jelinek }
350*385cc6b4SJerry Jelinek
351*385cc6b4SJerry Jelinek AcpiDbgLevel = AcpiGbl_OriginalDbgLevel;
352*385cc6b4SJerry Jelinek AcpiDbgLayer = AcpiGbl_OriginalDbgLayer;
353*385cc6b4SJerry Jelinek AcpiGbl_TraceMethodObject = NULL;
354*385cc6b4SJerry Jelinek }
355*385cc6b4SJerry Jelinek
356*385cc6b4SJerry Jelinek (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
357*385cc6b4SJerry Jelinek
358*385cc6b4SJerry Jelinek ExitPath:
359*385cc6b4SJerry Jelinek if (Pathname)
360*385cc6b4SJerry Jelinek {
361*385cc6b4SJerry Jelinek ACPI_FREE (Pathname);
362*385cc6b4SJerry Jelinek }
363*385cc6b4SJerry Jelinek }
364*385cc6b4SJerry Jelinek
365*385cc6b4SJerry Jelinek
366*385cc6b4SJerry Jelinek /*******************************************************************************
367*385cc6b4SJerry Jelinek *
368*385cc6b4SJerry Jelinek * FUNCTION: AcpiExStartTraceOpcode
369*385cc6b4SJerry Jelinek *
370*385cc6b4SJerry Jelinek * PARAMETERS: Op - The parser opcode object
371*385cc6b4SJerry Jelinek * WalkState - current state, NULL if not yet executing
372*385cc6b4SJerry Jelinek * a method.
373*385cc6b4SJerry Jelinek *
374*385cc6b4SJerry Jelinek * RETURN: None
375*385cc6b4SJerry Jelinek *
376*385cc6b4SJerry Jelinek * DESCRIPTION: Start opcode execution trace
377*385cc6b4SJerry Jelinek *
378*385cc6b4SJerry Jelinek ******************************************************************************/
379*385cc6b4SJerry Jelinek
380*385cc6b4SJerry Jelinek void
AcpiExStartTraceOpcode(ACPI_PARSE_OBJECT * Op,ACPI_WALK_STATE * WalkState)381*385cc6b4SJerry Jelinek AcpiExStartTraceOpcode (
382*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op,
383*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState)
384*385cc6b4SJerry Jelinek {
385*385cc6b4SJerry Jelinek
386*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (ExStartTraceOpcode);
387*385cc6b4SJerry Jelinek
388*385cc6b4SJerry Jelinek
389*385cc6b4SJerry Jelinek if (AcpiExInterpreterTraceEnabled (NULL) &&
390*385cc6b4SJerry Jelinek (AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
391*385cc6b4SJerry Jelinek {
392*385cc6b4SJerry Jelinek ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, TRUE,
393*385cc6b4SJerry Jelinek Op->Common.Aml, Op->Common.AmlOpName);
394*385cc6b4SJerry Jelinek }
395*385cc6b4SJerry Jelinek }
396*385cc6b4SJerry Jelinek
397*385cc6b4SJerry Jelinek
398*385cc6b4SJerry Jelinek /*******************************************************************************
399*385cc6b4SJerry Jelinek *
400*385cc6b4SJerry Jelinek * FUNCTION: AcpiExStopTraceOpcode
401*385cc6b4SJerry Jelinek *
402*385cc6b4SJerry Jelinek * PARAMETERS: Op - The parser opcode object
403*385cc6b4SJerry Jelinek * WalkState - current state, NULL if not yet executing
404*385cc6b4SJerry Jelinek * a method.
405*385cc6b4SJerry Jelinek *
406*385cc6b4SJerry Jelinek * RETURN: None
407*385cc6b4SJerry Jelinek *
408*385cc6b4SJerry Jelinek * DESCRIPTION: Stop opcode execution trace
409*385cc6b4SJerry Jelinek *
410*385cc6b4SJerry Jelinek ******************************************************************************/
411*385cc6b4SJerry Jelinek
412*385cc6b4SJerry Jelinek void
AcpiExStopTraceOpcode(ACPI_PARSE_OBJECT * Op,ACPI_WALK_STATE * WalkState)413*385cc6b4SJerry Jelinek AcpiExStopTraceOpcode (
414*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op,
415*385cc6b4SJerry Jelinek ACPI_WALK_STATE *WalkState)
416*385cc6b4SJerry Jelinek {
417*385cc6b4SJerry Jelinek
418*385cc6b4SJerry Jelinek ACPI_FUNCTION_NAME (ExStopTraceOpcode);
419*385cc6b4SJerry Jelinek
420*385cc6b4SJerry Jelinek
421*385cc6b4SJerry Jelinek if (AcpiExInterpreterTraceEnabled (NULL) &&
422*385cc6b4SJerry Jelinek (AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
423*385cc6b4SJerry Jelinek {
424*385cc6b4SJerry Jelinek ACPI_TRACE_POINT (ACPI_TRACE_AML_OPCODE, FALSE,
425*385cc6b4SJerry Jelinek Op->Common.Aml, Op->Common.AmlOpName);
426*385cc6b4SJerry Jelinek }
427*385cc6b4SJerry Jelinek }
428