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