ReactOS  0.4.15-dev-341-g17c5fb8
extrace.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Module Name: extrace - Support for interpreter execution tracing
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2020, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
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.
25  *
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.
29  *
30  * NO WARRANTY
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.
42  */
43 
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acnamesp.h"
47 #include "acinterp.h"
48 
49 
50 #define _COMPONENT ACPI_EXECUTER
51  ACPI_MODULE_NAME ("extrace")
52 
53 
55 
56 /* Local prototypes */
57 
58 #ifdef ACPI_DEBUG_OUTPUT
59 static const char *
60 AcpiExGetTraceEventName (
62 #endif
63 
64 
65 /*******************************************************************************
66  *
67  * FUNCTION: AcpiExInterpreterTraceEnabled
68  *
69  * PARAMETERS: Name - Whether method name should be matched,
70  * this should be checked before starting
71  * the tracer
72  *
73  * RETURN: TRUE if interpreter trace is enabled.
74  *
75  * DESCRIPTION: Check whether interpreter trace is enabled
76  *
77  ******************************************************************************/
78 
79 static BOOLEAN
81  char *Name)
82 {
83 
84  /* Check if tracing is enabled */
85 
86  if (!(AcpiGbl_TraceFlags & ACPI_TRACE_ENABLED))
87  {
88  return (FALSE);
89  }
90 
91  /*
92  * Check if tracing is filtered:
93  *
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
100  */
102  {
103  return (TRUE);
104  }
105 
106  if (Name &&
107  (AcpiGbl_TraceMethodName &&
108  strcmp (AcpiGbl_TraceMethodName, Name)))
109  {
110  return (FALSE);
111  }
112 
113  if ((AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT) &&
114  !AcpiGbl_TraceMethodName)
115  {
116  return (FALSE);
117  }
118 
119  return (TRUE);
120 }
121 
122 
123 /*******************************************************************************
124  *
125  * FUNCTION: AcpiExGetTraceEventName
126  *
127  * PARAMETERS: Type - Trace event type
128  *
129  * RETURN: Trace event name.
130  *
131  * DESCRIPTION: Used to obtain the full trace event name.
132  *
133  ******************************************************************************/
134 
135 #ifdef ACPI_DEBUG_OUTPUT
136 
137 static const char *
138 AcpiExGetTraceEventName (
140 {
141 
142  switch (Type)
143  {
145 
146  return "Method";
147 
149 
150  return "Opcode";
151 
153 
154  return "Region";
155 
156  default:
157 
158  return "";
159  }
160 }
161 
162 #endif
163 
164 
165 /*******************************************************************************
166  *
167  * FUNCTION: AcpiExTracePoint
168  *
169  * PARAMETERS: Type - Trace event type
170  * Begin - TRUE if before execution
171  * Aml - Executed AML address
172  * Pathname - Object path
173  *
174  * RETURN: None
175  *
176  * DESCRIPTION: Internal interpreter execution trace.
177  *
178  ******************************************************************************/
179 
180 void
183  BOOLEAN Begin,
184  UINT8 *Aml,
185  char *Pathname)
186 {
187 
188  ACPI_FUNCTION_NAME (ExTracePoint);
189 
190 
191  if (Pathname)
192  {
194  "%s %s [0x%p:%s] execution.\n",
195  AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
196  Aml, Pathname));
197  }
198  else
199  {
201  "%s %s [0x%p] execution.\n",
202  AcpiExGetTraceEventName (Type), Begin ? "Begin" : "End",
203  Aml));
204  }
205 }
206 
207 
208 /*******************************************************************************
209  *
210  * FUNCTION: AcpiExStartTraceMethod
211  *
212  * PARAMETERS: MethodNode - Node of the method
213  * ObjDesc - The method object
214  * WalkState - current state, NULL if not yet executing
215  * a method.
216  *
217  * RETURN: None
218  *
219  * DESCRIPTION: Start control method execution trace
220  *
221  ******************************************************************************/
222 
223 void
225  ACPI_NAMESPACE_NODE *MethodNode,
226  ACPI_OPERAND_OBJECT *ObjDesc,
227  ACPI_WALK_STATE *WalkState)
228 {
229  char *Pathname = NULL;
231 
232 
233  ACPI_FUNCTION_NAME (ExStartTraceMethod);
234 
235 
236  if (MethodNode)
237  {
238  Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
239  }
240 
243  {
244  AcpiGbl_TraceMethodObject = ObjDesc;
245  AcpiGbl_OriginalDbgLevel = AcpiDbgLevel;
246  AcpiGbl_OriginalDbgLayer = AcpiDbgLayer;
247  AcpiDbgLevel = ACPI_TRACE_LEVEL_ALL;
248  AcpiDbgLayer = ACPI_TRACE_LAYER_ALL;
249 
250  if (AcpiGbl_TraceDbgLevel)
251  {
252  AcpiDbgLevel = AcpiGbl_TraceDbgLevel;
253  }
254 
255  if (AcpiGbl_TraceDbgLayer)
256  {
257  AcpiDbgLayer = AcpiGbl_TraceDbgLayer;
258  }
259  }
260 
261  if (Enabled)
262  {
264  ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
265  }
266 
267  if (Pathname)
268  {
270  }
271 }
272 
273 
274 /*******************************************************************************
275  *
276  * FUNCTION: AcpiExStopTraceMethod
277  *
278  * PARAMETERS: MethodNode - Node of the method
279  * ObjDesc - The method object
280  * WalkState - current state, NULL if not yet executing
281  * a method.
282  *
283  * RETURN: None
284  *
285  * DESCRIPTION: Stop control method execution trace
286  *
287  ******************************************************************************/
288 
289 void
291  ACPI_NAMESPACE_NODE *MethodNode,
292  ACPI_OPERAND_OBJECT *ObjDesc,
293  ACPI_WALK_STATE *WalkState)
294 {
295  char *Pathname = NULL;
297 
298 
299  ACPI_FUNCTION_NAME (ExStopTraceMethod);
300 
301 
302  if (MethodNode)
303  {
304  Pathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
305  }
306 
308 
309  if (Enabled)
310  {
312  ObjDesc ? ObjDesc->Method.AmlStart : NULL, Pathname);
313  }
314 
315  /* Check whether the tracer should be stopped */
316 
317  if (AcpiGbl_TraceMethodObject == ObjDesc)
318  {
319  /* Disable further tracing if type is one-shot */
320 
321  if (AcpiGbl_TraceFlags & ACPI_TRACE_ONESHOT)
322  {
323  AcpiGbl_TraceMethodName = NULL;
324  }
325 
326  AcpiDbgLevel = AcpiGbl_OriginalDbgLevel;
327  AcpiDbgLayer = AcpiGbl_OriginalDbgLayer;
329  }
330 
331  if (Pathname)
332  {
334  }
335 }
336 
337 
338 /*******************************************************************************
339  *
340  * FUNCTION: AcpiExStartTraceOpcode
341  *
342  * PARAMETERS: Op - The parser opcode object
343  * WalkState - current state, NULL if not yet executing
344  * a method.
345  *
346  * RETURN: None
347  *
348  * DESCRIPTION: Start opcode execution trace
349  *
350  ******************************************************************************/
351 
352 void
354  ACPI_PARSE_OBJECT *Op,
355  ACPI_WALK_STATE *WalkState)
356 {
357 
358  ACPI_FUNCTION_NAME (ExStartTraceOpcode);
359 
360 
362  (AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
363  {
365  Op->Common.Aml, Op->Common.AmlOpName);
366  }
367 }
368 
369 
370 /*******************************************************************************
371  *
372  * FUNCTION: AcpiExStopTraceOpcode
373  *
374  * PARAMETERS: Op - The parser opcode object
375  * WalkState - current state, NULL if not yet executing
376  * a method.
377  *
378  * RETURN: None
379  *
380  * DESCRIPTION: Stop opcode execution trace
381  *
382  ******************************************************************************/
383 
384 void
386  ACPI_PARSE_OBJECT *Op,
387  ACPI_WALK_STATE *WalkState)
388 {
389 
390  ACPI_FUNCTION_NAME (ExStopTraceOpcode);
391 
392 
394  (AcpiGbl_TraceFlags & ACPI_TRACE_OPCODE))
395  {
397  Op->Common.Aml, Op->Common.AmlOpName);
398  }
399 }
#define ACPI_FREE(a)
Definition: actypes.h:386
UINT8 * AmlStart
Definition: acobject.h:220
ACPI_PARSE_OBJ_COMMON Common
Definition: aclocal.h:1078
#define ACPI_TRACE_LAYER_ALL
Definition: acoutput.h:204
#define TRUE
Definition: types.h:120
void AcpiExTracePoint(ACPI_TRACE_EVENT_TYPE Type, BOOLEAN Begin, UINT8 *Aml, char *Pathname)
Definition: extrace.c:181
#define ACPI_TRACE_LEVEL_ALL
Definition: acoutput.h:203
Type
Definition: Type.h:6
#define ACPI_TRACE_POINT(a, b, c, d)
Definition: acoutput.h:491
#define ACPI_TRACE_ONESHOT
Definition: acoutput.h:198
#define ACPI_MODULE_NAME(Name)
Definition: acoutput.h:216
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
void AcpiExStartTraceMethod(ACPI_NAMESPACE_NODE *MethodNode, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_WALK_STATE *WalkState)
Definition: extrace.c:224
void AcpiExStopTraceOpcode(ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
Definition: extrace.c:385
static BOOLEAN AcpiExInterpreterTraceEnabled(char *Name)
Definition: extrace.c:80
ACPI_TRACE_EVENT_TYPE
Definition: actypes.h:1374
#define ACPI_DB_TRACE_POINT
Definition: acoutput.h:155
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
static ACPI_OPERAND_OBJECT * AcpiGbl_TraceMethodObject
Definition: extrace.c:54
#define ACPI_TRACE_ENABLED
Definition: acoutput.h:197
ACPI_OBJECT_METHOD Method
Definition: acobject.h:523
char * AcpiNsGetNormalizedPathname(ACPI_NAMESPACE_NODE *Node, BOOLEAN NoTrailing)
Definition: nsnames.c:367
void AcpiExStopTraceMethod(ACPI_NAMESPACE_NODE *MethodNode, ACPI_OPERAND_OBJECT *ObjDesc, ACPI_WALK_STATE *WalkState)
Definition: extrace.c:290
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 const char BOOLEAN Begin
Definition: acpixf.h:1297
#define ACPI_FUNCTION_NAME(a)
Definition: acoutput.h:479
#define ACPI_TRACE_OPCODE
Definition: acoutput.h:199
unsigned char UINT8
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 const char BOOLEAN UINT8 * Aml
Definition: acpixf.h:1297
void AcpiExStartTraceOpcode(ACPI_PARSE_OBJECT *Op, ACPI_WALK_STATE *WalkState)
Definition: extrace.c:353
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING Pathname
Definition: acpixf.h:700