xref: /titanic_52/usr/src/uts/intel/io/acpica/executer/extrace.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
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
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 *
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
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
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
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
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
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