ccdca57bff578dc233ed1f336cbabe8bbe933080
[reactos.git] / reactos / drivers / bus / acpi / acpica / utilities / utdebug.c
1 /******************************************************************************
2 *
3 * Module Name: utdebug - Debug print/trace routines
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2016, 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 #define EXPORT_ACPI_INTERFACES
45
46 #include "acpi.h"
47 #include "accommon.h"
48 #include "acinterp.h"
49
50 #define _COMPONENT ACPI_UTILITIES
51 ACPI_MODULE_NAME ("utdebug")
52
53
54 #ifdef ACPI_DEBUG_OUTPUT
55
56 static ACPI_THREAD_ID AcpiGbl_PrevThreadId = (ACPI_THREAD_ID) 0xFFFFFFFF;
57 static char *AcpiGbl_FnEntryStr = "----Entry";
58 static char *AcpiGbl_FnExitStr = "----Exit-";
59
60 /* Local prototypes */
61
62 static const char *
63 AcpiUtTrimFunctionName (
64 const char *FunctionName);
65
66
67 /*******************************************************************************
68 *
69 * FUNCTION: AcpiUtInitStackPtrTrace
70 *
71 * PARAMETERS: None
72 *
73 * RETURN: None
74 *
75 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
76 *
77 ******************************************************************************/
78
79 void
80 AcpiUtInitStackPtrTrace (
81 void)
82 {
83 ACPI_SIZE CurrentSp;
84
85
86 AcpiGbl_EntryStackPointer = &CurrentSp;
87 }
88
89
90 /*******************************************************************************
91 *
92 * FUNCTION: AcpiUtTrackStackPtr
93 *
94 * PARAMETERS: None
95 *
96 * RETURN: None
97 *
98 * DESCRIPTION: Save the current CPU stack pointer
99 *
100 ******************************************************************************/
101
102 void
103 AcpiUtTrackStackPtr (
104 void)
105 {
106 ACPI_SIZE CurrentSp;
107
108
109 if (&CurrentSp < AcpiGbl_LowestStackPointer)
110 {
111 AcpiGbl_LowestStackPointer = &CurrentSp;
112 }
113
114 if (AcpiGbl_NestingLevel > AcpiGbl_DeepestNesting)
115 {
116 AcpiGbl_DeepestNesting = AcpiGbl_NestingLevel;
117 }
118 }
119
120
121 /*******************************************************************************
122 *
123 * FUNCTION: AcpiUtTrimFunctionName
124 *
125 * PARAMETERS: FunctionName - Ascii string containing a procedure name
126 *
127 * RETURN: Updated pointer to the function name
128 *
129 * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
130 * This allows compiler macros such as __FUNCTION__ to be used
131 * with no change to the debug output.
132 *
133 ******************************************************************************/
134
135 static const char *
136 AcpiUtTrimFunctionName (
137 const char *FunctionName)
138 {
139
140 /* All Function names are longer than 4 chars, check is safe */
141
142 if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_MIXED)
143 {
144 /* This is the case where the original source has not been modified */
145
146 return (FunctionName + 4);
147 }
148
149 if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_LOWER)
150 {
151 /* This is the case where the source has been 'linuxized' */
152
153 return (FunctionName + 5);
154 }
155
156 return (FunctionName);
157 }
158
159
160 /*******************************************************************************
161 *
162 * FUNCTION: AcpiDebugPrint
163 *
164 * PARAMETERS: RequestedDebugLevel - Requested debug print level
165 * LineNumber - Caller's line number (for error output)
166 * FunctionName - Caller's procedure name
167 * ModuleName - Caller's module name
168 * ComponentId - Caller's component ID
169 * Format - Printf format field
170 * ... - Optional printf arguments
171 *
172 * RETURN: None
173 *
174 * DESCRIPTION: Print error message with prefix consisting of the module name,
175 * line number, and component ID.
176 *
177 ******************************************************************************/
178
179 void ACPI_INTERNAL_VAR_XFACE
180 AcpiDebugPrint (
181 UINT32 RequestedDebugLevel,
182 UINT32 LineNumber,
183 const char *FunctionName,
184 const char *ModuleName,
185 UINT32 ComponentId,
186 const char *Format,
187 ...)
188 {
189 ACPI_THREAD_ID ThreadId;
190 va_list args;
191
192
193 /* Check if debug output enabled */
194
195 if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))
196 {
197 return;
198 }
199
200 /*
201 * Thread tracking and context switch notification
202 */
203 ThreadId = AcpiOsGetThreadId ();
204 if (ThreadId != AcpiGbl_PrevThreadId)
205 {
206 if (ACPI_LV_THREADS & AcpiDbgLevel)
207 {
208 AcpiOsPrintf (
209 "\n**** Context Switch from TID %u to TID %u ****\n\n",
210 (UINT32) AcpiGbl_PrevThreadId, (UINT32) ThreadId);
211 }
212
213 AcpiGbl_PrevThreadId = ThreadId;
214 AcpiGbl_NestingLevel = 0;
215 }
216
217 /*
218 * Display the module name, current line number, thread ID (if requested),
219 * current procedure nesting level, and the current procedure name
220 */
221 AcpiOsPrintf ("%9s-%04ld ", ModuleName, LineNumber);
222
223 #ifdef ACPI_APPLICATION
224 /*
225 * For AcpiExec/iASL only, emit the thread ID and nesting level.
226 * Note: nesting level is really only useful during a single-thread
227 * execution. Otherwise, multiple threads will keep resetting the
228 * level.
229 */
230 if (ACPI_LV_THREADS & AcpiDbgLevel)
231 {
232 AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
233 }
234
235 AcpiOsPrintf ("[%02ld] ", AcpiGbl_NestingLevel);
236 #endif
237
238 AcpiOsPrintf ("%-22.22s: ", AcpiUtTrimFunctionName (FunctionName));
239
240 va_start (args, Format);
241 AcpiOsVprintf (Format, args);
242 va_end (args);
243 }
244
245 ACPI_EXPORT_SYMBOL (AcpiDebugPrint)
246
247
248 /*******************************************************************************
249 *
250 * FUNCTION: AcpiDebugPrintRaw
251 *
252 * PARAMETERS: RequestedDebugLevel - Requested debug print level
253 * LineNumber - Caller's line number
254 * FunctionName - Caller's procedure name
255 * ModuleName - Caller's module name
256 * ComponentId - Caller's component ID
257 * Format - Printf format field
258 * ... - Optional printf arguments
259 *
260 * RETURN: None
261 *
262 * DESCRIPTION: Print message with no headers. Has same interface as
263 * DebugPrint so that the same macros can be used.
264 *
265 ******************************************************************************/
266
267 void ACPI_INTERNAL_VAR_XFACE
268 AcpiDebugPrintRaw (
269 UINT32 RequestedDebugLevel,
270 UINT32 LineNumber,
271 const char *FunctionName,
272 const char *ModuleName,
273 UINT32 ComponentId,
274 const char *Format,
275 ...)
276 {
277 va_list args;
278
279
280 /* Check if debug output enabled */
281
282 if (!ACPI_IS_DEBUG_ENABLED (RequestedDebugLevel, ComponentId))
283 {
284 return;
285 }
286
287 va_start (args, Format);
288 AcpiOsVprintf (Format, args);
289 va_end (args);
290 }
291
292 ACPI_EXPORT_SYMBOL (AcpiDebugPrintRaw)
293
294
295 /*******************************************************************************
296 *
297 * FUNCTION: AcpiUtTrace
298 *
299 * PARAMETERS: LineNumber - Caller's line number
300 * FunctionName - Caller's procedure name
301 * ModuleName - Caller's module name
302 * ComponentId - Caller's component ID
303 *
304 * RETURN: None
305 *
306 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
307 * set in DebugLevel
308 *
309 ******************************************************************************/
310
311 void
312 AcpiUtTrace (
313 UINT32 LineNumber,
314 const char *FunctionName,
315 const char *ModuleName,
316 UINT32 ComponentId)
317 {
318
319 AcpiGbl_NestingLevel++;
320 AcpiUtTrackStackPtr ();
321
322 /* Check if enabled up-front for performance */
323
324 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
325 {
326 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
327 LineNumber, FunctionName, ModuleName, ComponentId,
328 "%s\n", AcpiGbl_FnEntryStr);
329 }
330 }
331
332 ACPI_EXPORT_SYMBOL (AcpiUtTrace)
333
334
335 /*******************************************************************************
336 *
337 * FUNCTION: AcpiUtTracePtr
338 *
339 * PARAMETERS: LineNumber - Caller's line number
340 * FunctionName - Caller's procedure name
341 * ModuleName - Caller's module name
342 * ComponentId - Caller's component ID
343 * Pointer - Pointer to display
344 *
345 * RETURN: None
346 *
347 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
348 * set in DebugLevel
349 *
350 ******************************************************************************/
351
352 void
353 AcpiUtTracePtr (
354 UINT32 LineNumber,
355 const char *FunctionName,
356 const char *ModuleName,
357 UINT32 ComponentId,
358 void *Pointer)
359 {
360
361 AcpiGbl_NestingLevel++;
362 AcpiUtTrackStackPtr ();
363
364 /* Check if enabled up-front for performance */
365
366 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
367 {
368 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
369 LineNumber, FunctionName, ModuleName, ComponentId,
370 "%s %p\n", AcpiGbl_FnEntryStr, Pointer);
371 }
372 }
373
374
375 /*******************************************************************************
376 *
377 * FUNCTION: AcpiUtTraceStr
378 *
379 * PARAMETERS: LineNumber - Caller's line number
380 * FunctionName - Caller's procedure name
381 * ModuleName - Caller's module name
382 * ComponentId - Caller's component ID
383 * String - Additional string to display
384 *
385 * RETURN: None
386 *
387 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
388 * set in DebugLevel
389 *
390 ******************************************************************************/
391
392 void
393 AcpiUtTraceStr (
394 UINT32 LineNumber,
395 const char *FunctionName,
396 const char *ModuleName,
397 UINT32 ComponentId,
398 char *String)
399 {
400
401 AcpiGbl_NestingLevel++;
402 AcpiUtTrackStackPtr ();
403
404 /* Check if enabled up-front for performance */
405
406 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
407 {
408 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
409 LineNumber, FunctionName, ModuleName, ComponentId,
410 "%s %s\n", AcpiGbl_FnEntryStr, String);
411 }
412 }
413
414
415 /*******************************************************************************
416 *
417 * FUNCTION: AcpiUtTraceU32
418 *
419 * PARAMETERS: LineNumber - Caller's line number
420 * FunctionName - Caller's procedure name
421 * ModuleName - Caller's module name
422 * ComponentId - Caller's component ID
423 * Integer - Integer to display
424 *
425 * RETURN: None
426 *
427 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
428 * set in DebugLevel
429 *
430 ******************************************************************************/
431
432 void
433 AcpiUtTraceU32 (
434 UINT32 LineNumber,
435 const char *FunctionName,
436 const char *ModuleName,
437 UINT32 ComponentId,
438 UINT32 Integer)
439 {
440
441 AcpiGbl_NestingLevel++;
442 AcpiUtTrackStackPtr ();
443
444 /* Check if enabled up-front for performance */
445
446 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
447 {
448 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
449 LineNumber, FunctionName, ModuleName, ComponentId,
450 "%s %08X\n", AcpiGbl_FnEntryStr, Integer);
451 }
452 }
453
454
455 /*******************************************************************************
456 *
457 * FUNCTION: AcpiUtExit
458 *
459 * PARAMETERS: LineNumber - Caller's line number
460 * FunctionName - Caller's procedure name
461 * ModuleName - Caller's module name
462 * ComponentId - Caller's component ID
463 *
464 * RETURN: None
465 *
466 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
467 * set in DebugLevel
468 *
469 ******************************************************************************/
470
471 void
472 AcpiUtExit (
473 UINT32 LineNumber,
474 const char *FunctionName,
475 const char *ModuleName,
476 UINT32 ComponentId)
477 {
478
479 /* Check if enabled up-front for performance */
480
481 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
482 {
483 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
484 LineNumber, FunctionName, ModuleName, ComponentId,
485 "%s\n", AcpiGbl_FnExitStr);
486 }
487
488 if (AcpiGbl_NestingLevel)
489 {
490 AcpiGbl_NestingLevel--;
491 }
492 }
493
494 ACPI_EXPORT_SYMBOL (AcpiUtExit)
495
496
497 /*******************************************************************************
498 *
499 * FUNCTION: AcpiUtStatusExit
500 *
501 * PARAMETERS: LineNumber - Caller's line number
502 * FunctionName - Caller's procedure name
503 * ModuleName - Caller's module name
504 * ComponentId - Caller's component ID
505 * Status - Exit status code
506 *
507 * RETURN: None
508 *
509 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
510 * set in DebugLevel. Prints exit status also.
511 *
512 ******************************************************************************/
513
514 void
515 AcpiUtStatusExit (
516 UINT32 LineNumber,
517 const char *FunctionName,
518 const char *ModuleName,
519 UINT32 ComponentId,
520 ACPI_STATUS Status)
521 {
522
523 /* Check if enabled up-front for performance */
524
525 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
526 {
527 if (ACPI_SUCCESS (Status))
528 {
529 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
530 LineNumber, FunctionName, ModuleName, ComponentId,
531 "%s %s\n", AcpiGbl_FnExitStr,
532 AcpiFormatException (Status));
533 }
534 else
535 {
536 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
537 LineNumber, FunctionName, ModuleName, ComponentId,
538 "%s ****Exception****: %s\n", AcpiGbl_FnExitStr,
539 AcpiFormatException (Status));
540 }
541 }
542
543 if (AcpiGbl_NestingLevel)
544 {
545 AcpiGbl_NestingLevel--;
546 }
547 }
548
549 ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
550
551
552 /*******************************************************************************
553 *
554 * FUNCTION: AcpiUtValueExit
555 *
556 * PARAMETERS: LineNumber - Caller's line number
557 * FunctionName - Caller's procedure name
558 * ModuleName - Caller's module name
559 * ComponentId - Caller's component ID
560 * Value - Value to be printed with exit msg
561 *
562 * RETURN: None
563 *
564 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
565 * set in DebugLevel. Prints exit value also.
566 *
567 ******************************************************************************/
568
569 void
570 AcpiUtValueExit (
571 UINT32 LineNumber,
572 const char *FunctionName,
573 const char *ModuleName,
574 UINT32 ComponentId,
575 UINT64 Value)
576 {
577
578 /* Check if enabled up-front for performance */
579
580 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
581 {
582 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
583 LineNumber, FunctionName, ModuleName, ComponentId,
584 "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr,
585 ACPI_FORMAT_UINT64 (Value));
586 }
587
588 if (AcpiGbl_NestingLevel)
589 {
590 AcpiGbl_NestingLevel--;
591 }
592 }
593
594 ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
595
596
597 /*******************************************************************************
598 *
599 * FUNCTION: AcpiUtPtrExit
600 *
601 * PARAMETERS: LineNumber - Caller's line number
602 * FunctionName - Caller's procedure name
603 * ModuleName - Caller's module name
604 * ComponentId - Caller's component ID
605 * Ptr - Pointer to display
606 *
607 * RETURN: None
608 *
609 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
610 * set in DebugLevel. Prints exit value also.
611 *
612 ******************************************************************************/
613
614 void
615 AcpiUtPtrExit (
616 UINT32 LineNumber,
617 const char *FunctionName,
618 const char *ModuleName,
619 UINT32 ComponentId,
620 UINT8 *Ptr)
621 {
622
623 /* Check if enabled up-front for performance */
624
625 if (ACPI_IS_DEBUG_ENABLED (ACPI_LV_FUNCTIONS, ComponentId))
626 {
627 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
628 LineNumber, FunctionName, ModuleName, ComponentId,
629 "%s %p\n", AcpiGbl_FnExitStr, Ptr);
630 }
631
632 if (AcpiGbl_NestingLevel)
633 {
634 AcpiGbl_NestingLevel--;
635 }
636 }
637
638
639 /*******************************************************************************
640 *
641 * FUNCTION: AcpiTracePoint
642 *
643 * PARAMETERS: Type - Trace event type
644 * Begin - TRUE if before execution
645 * Aml - Executed AML address
646 * Pathname - Object path
647 * Pointer - Pointer to the related object
648 *
649 * RETURN: None
650 *
651 * DESCRIPTION: Interpreter execution trace.
652 *
653 ******************************************************************************/
654
655 void
656 AcpiTracePoint (
657 ACPI_TRACE_EVENT_TYPE Type,
658 BOOLEAN Begin,
659 UINT8 *Aml,
660 char *Pathname)
661 {
662
663 ACPI_FUNCTION_ENTRY ();
664
665 AcpiExTracePoint (Type, Begin, Aml, Pathname);
666
667 #ifdef ACPI_USE_SYSTEM_TRACER
668 AcpiOsTracePoint (Type, Begin, Aml, Pathname);
669 #endif
670 }
671
672 ACPI_EXPORT_SYMBOL (AcpiTracePoint)
673
674 #endif
675
676
677 #ifdef ACPI_APPLICATION
678 /*******************************************************************************
679 *
680 * FUNCTION: AcpiLogError
681 *
682 * PARAMETERS: Format - Printf format field
683 * ... - Optional printf arguments
684 *
685 * RETURN: None
686 *
687 * DESCRIPTION: Print error message to the console, used by applications.
688 *
689 ******************************************************************************/
690
691 void ACPI_INTERNAL_VAR_XFACE
692 AcpiLogError (
693 const char *Format,
694 ...)
695 {
696 va_list Args;
697
698 va_start (Args, Format);
699 (void) AcpiUtFileVprintf (ACPI_FILE_ERR, Format, Args);
700 va_end (Args);
701 }
702
703 ACPI_EXPORT_SYMBOL (AcpiLogError)
704 #endif