utdebug.c revision 1.4.2.2 1 /******************************************************************************
2 *
3 * Module Name: utdebug - Debug print routines
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2011, 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 __UTDEBUG_C__
45
46 #include "acpi.h"
47 #include "accommon.h"
48
49 #define _COMPONENT ACPI_UTILITIES
50 ACPI_MODULE_NAME ("utdebug")
51
52
53 #ifdef ACPI_DEBUG_OUTPUT
54
55 static ACPI_THREAD_ID AcpiGbl_PrevThreadId = (ACPI_THREAD_ID) 0xFFFFFFFF;
56 static const char *AcpiGbl_FnEntryStr = "----Entry";
57 static const char *AcpiGbl_FnExitStr = "----Exit-";
58
59 /* Local prototypes */
60
61 static const char *
62 AcpiUtTrimFunctionName (
63 const char *FunctionName);
64
65
66 /*******************************************************************************
67 *
68 * FUNCTION: AcpiUtInitStackPtrTrace
69 *
70 * PARAMETERS: None
71 *
72 * RETURN: None
73 *
74 * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
75 *
76 ******************************************************************************/
77
78 void
79 AcpiUtInitStackPtrTrace (
80 void)
81 {
82 ACPI_SIZE CurrentSp;
83
84
85 AcpiGbl_EntryStackPointer = &CurrentSp;
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
191
192 /*
193 * Stay silent if the debug level or component ID is disabled
194 */
195 if (!(RequestedDebugLevel & AcpiDbgLevel) ||
196 !(ComponentId & AcpiDbgLayer))
197 {
198 return;
199 }
200
201 /*
202 * Thread tracking and context switch notification
203 */
204 ThreadId = AcpiOsGetThreadId ();
205 if (ThreadId != AcpiGbl_PrevThreadId)
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_PrevThreadId, (UINT32) ThreadId);
212 }
213
214 AcpiGbl_PrevThreadId = ThreadId;
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 ("%8s-%04ld ", ModuleName, LineNumber);
222
223 if (ACPI_LV_THREADS & AcpiDbgLevel)
224 {
225 AcpiOsPrintf ("[%u] ", (UINT32) ThreadId);
226 }
227
228 AcpiOsPrintf ("[%02ld] %-22.22s: ",
229 AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName));
230
231 va_start (args, Format);
232 AcpiOsVprintf (Format, args);
233 va_end (args);
234 }
235
236 ACPI_EXPORT_SYMBOL (AcpiDebugPrint)
237
238
239 /*******************************************************************************
240 *
241 * FUNCTION: AcpiDebugPrintRaw
242 *
243 * PARAMETERS: RequestedDebugLevel - Requested debug print level
244 * LineNumber - Caller's line number
245 * FunctionName - Caller's procedure name
246 * ModuleName - Caller's module name
247 * ComponentId - Caller's component ID
248 * Format - Printf format field
249 * ... - Optional printf arguments
250 *
251 * RETURN: None
252 *
253 * DESCRIPTION: Print message with no headers. Has same interface as
254 * DebugPrint so that the same macros can be used.
255 *
256 ******************************************************************************/
257
258 void ACPI_INTERNAL_VAR_XFACE
259 AcpiDebugPrintRaw (
260 UINT32 RequestedDebugLevel,
261 UINT32 LineNumber,
262 const char *FunctionName,
263 const char *ModuleName,
264 UINT32 ComponentId,
265 const char *Format,
266 ...)
267 {
268 va_list args;
269
270
271 if (!(RequestedDebugLevel & AcpiDbgLevel) ||
272 !(ComponentId & AcpiDbgLayer))
273 {
274 return;
275 }
276
277 va_start (args, Format);
278 AcpiOsVprintf (Format, args);
279 va_end (args);
280 }
281
282 ACPI_EXPORT_SYMBOL (AcpiDebugPrintRaw)
283
284
285 /*******************************************************************************
286 *
287 * FUNCTION: AcpiUtTrace
288 *
289 * PARAMETERS: LineNumber - Caller's line number
290 * FunctionName - Caller's procedure name
291 * ModuleName - Caller's module name
292 * ComponentId - Caller's component ID
293 *
294 * RETURN: None
295 *
296 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
297 * set in DebugLevel
298 *
299 ******************************************************************************/
300
301 void
302 AcpiUtTrace (
303 UINT32 LineNumber,
304 const char *FunctionName,
305 const char *ModuleName,
306 UINT32 ComponentId)
307 {
308
309 AcpiGbl_NestingLevel++;
310 AcpiUtTrackStackPtr ();
311
312 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
313 LineNumber, FunctionName, ModuleName, ComponentId,
314 "%s\n", AcpiGbl_FnEntryStr);
315 }
316
317 ACPI_EXPORT_SYMBOL (AcpiUtTrace)
318
319
320 /*******************************************************************************
321 *
322 * FUNCTION: AcpiUtTracePtr
323 *
324 * PARAMETERS: LineNumber - Caller's line number
325 * FunctionName - Caller's procedure name
326 * ModuleName - Caller's module name
327 * ComponentId - Caller's component ID
328 * Pointer - Pointer to display
329 *
330 * RETURN: None
331 *
332 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
333 * set in DebugLevel
334 *
335 ******************************************************************************/
336
337 void
338 AcpiUtTracePtr (
339 UINT32 LineNumber,
340 const char *FunctionName,
341 const char *ModuleName,
342 UINT32 ComponentId,
343 void *Pointer)
344 {
345 AcpiGbl_NestingLevel++;
346 AcpiUtTrackStackPtr ();
347
348 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
349 LineNumber, FunctionName, ModuleName, ComponentId,
350 "%s %p\n", AcpiGbl_FnEntryStr, Pointer);
351 }
352
353
354 /*******************************************************************************
355 *
356 * FUNCTION: AcpiUtTraceStr
357 *
358 * PARAMETERS: LineNumber - Caller's line number
359 * FunctionName - Caller's procedure name
360 * ModuleName - Caller's module name
361 * ComponentId - Caller's component ID
362 * String - Additional string to display
363 *
364 * RETURN: None
365 *
366 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
367 * set in DebugLevel
368 *
369 ******************************************************************************/
370
371 void
372 AcpiUtTraceStr (
373 UINT32 LineNumber,
374 const char *FunctionName,
375 const char *ModuleName,
376 UINT32 ComponentId,
377 const char *String)
378 {
379
380 AcpiGbl_NestingLevel++;
381 AcpiUtTrackStackPtr ();
382
383 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
384 LineNumber, FunctionName, ModuleName, ComponentId,
385 "%s %s\n", AcpiGbl_FnEntryStr, String);
386 }
387
388
389 /*******************************************************************************
390 *
391 * FUNCTION: AcpiUtTraceU32
392 *
393 * PARAMETERS: LineNumber - Caller's line number
394 * FunctionName - Caller's procedure name
395 * ModuleName - Caller's module name
396 * ComponentId - Caller's component ID
397 * Integer - Integer to display
398 *
399 * RETURN: None
400 *
401 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
402 * set in DebugLevel
403 *
404 ******************************************************************************/
405
406 void
407 AcpiUtTraceU32 (
408 UINT32 LineNumber,
409 const char *FunctionName,
410 const char *ModuleName,
411 UINT32 ComponentId,
412 UINT32 Integer)
413 {
414
415 AcpiGbl_NestingLevel++;
416 AcpiUtTrackStackPtr ();
417
418 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
419 LineNumber, FunctionName, ModuleName, ComponentId,
420 "%s %08X\n", AcpiGbl_FnEntryStr, Integer);
421 }
422
423
424 /*******************************************************************************
425 *
426 * FUNCTION: AcpiUtExit
427 *
428 * PARAMETERS: LineNumber - Caller's line number
429 * FunctionName - Caller's procedure name
430 * ModuleName - Caller's module name
431 * ComponentId - Caller's component ID
432 *
433 * RETURN: None
434 *
435 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
436 * set in DebugLevel
437 *
438 ******************************************************************************/
439
440 void
441 AcpiUtExit (
442 UINT32 LineNumber,
443 const char *FunctionName,
444 const char *ModuleName,
445 UINT32 ComponentId)
446 {
447
448 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
449 LineNumber, FunctionName, ModuleName, ComponentId,
450 "%s\n", AcpiGbl_FnExitStr);
451
452 AcpiGbl_NestingLevel--;
453 }
454
455 ACPI_EXPORT_SYMBOL (AcpiUtExit)
456
457
458 /*******************************************************************************
459 *
460 * FUNCTION: AcpiUtStatusExit
461 *
462 * PARAMETERS: LineNumber - Caller's line number
463 * FunctionName - Caller's procedure name
464 * ModuleName - Caller's module name
465 * ComponentId - Caller's component ID
466 * Status - Exit status code
467 *
468 * RETURN: None
469 *
470 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
471 * set in DebugLevel. Prints exit status also.
472 *
473 ******************************************************************************/
474
475 void
476 AcpiUtStatusExit (
477 UINT32 LineNumber,
478 const char *FunctionName,
479 const char *ModuleName,
480 UINT32 ComponentId,
481 ACPI_STATUS Status)
482 {
483
484 if (ACPI_SUCCESS (Status))
485 {
486 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
487 LineNumber, FunctionName, ModuleName, ComponentId,
488 "%s %s\n", AcpiGbl_FnExitStr,
489 AcpiFormatException (Status));
490 }
491 else
492 {
493 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
494 LineNumber, FunctionName, ModuleName, ComponentId,
495 "%s ****Exception****: %s\n", AcpiGbl_FnExitStr,
496 AcpiFormatException (Status));
497 }
498
499 AcpiGbl_NestingLevel--;
500 }
501
502 ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
503
504
505 /*******************************************************************************
506 *
507 * FUNCTION: AcpiUtValueExit
508 *
509 * PARAMETERS: LineNumber - Caller's line number
510 * FunctionName - Caller's procedure name
511 * ModuleName - Caller's module name
512 * ComponentId - Caller's component ID
513 * Value - Value to be printed with exit msg
514 *
515 * RETURN: None
516 *
517 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
518 * set in DebugLevel. Prints exit value also.
519 *
520 ******************************************************************************/
521
522 void
523 AcpiUtValueExit (
524 UINT32 LineNumber,
525 const char *FunctionName,
526 const char *ModuleName,
527 UINT32 ComponentId,
528 UINT64 Value)
529 {
530
531 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
532 LineNumber, FunctionName, ModuleName, ComponentId,
533 "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr,
534 ACPI_FORMAT_UINT64 (Value));
535
536 AcpiGbl_NestingLevel--;
537 }
538
539 ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
540
541
542 /*******************************************************************************
543 *
544 * FUNCTION: AcpiUtPtrExit
545 *
546 * PARAMETERS: LineNumber - Caller's line number
547 * FunctionName - Caller's procedure name
548 * ModuleName - Caller's module name
549 * ComponentId - Caller's component ID
550 * Ptr - Pointer to display
551 *
552 * RETURN: None
553 *
554 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
555 * set in DebugLevel. Prints exit value also.
556 *
557 ******************************************************************************/
558
559 void
560 AcpiUtPtrExit (
561 UINT32 LineNumber,
562 const char *FunctionName,
563 const char *ModuleName,
564 UINT32 ComponentId,
565 UINT8 *Ptr)
566 {
567
568 AcpiDebugPrint (ACPI_LV_FUNCTIONS,
569 LineNumber, FunctionName, ModuleName, ComponentId,
570 "%s %p\n", AcpiGbl_FnExitStr, Ptr);
571
572 AcpiGbl_NestingLevel--;
573 }
574
575 #endif
576
577
578 /*******************************************************************************
579 *
580 * FUNCTION: AcpiUtDumpBuffer
581 *
582 * PARAMETERS: Buffer - Buffer to dump
583 * Count - Amount to dump, in bytes
584 * Display - BYTE, WORD, DWORD, or QWORD display
585 * ComponentID - Caller's component ID
586 *
587 * RETURN: None
588 *
589 * DESCRIPTION: Generic dump buffer in both hex and ascii.
590 *
591 ******************************************************************************/
592
593 void
594 AcpiUtDumpBuffer2 (
595 UINT8 *Buffer,
596 UINT32 Count,
597 UINT32 Display)
598 {
599 UINT32 i = 0;
600 UINT32 j;
601 UINT32 Temp32;
602 UINT8 BufChar;
603
604
605 if (!Buffer)
606 {
607 AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
608 return;
609 }
610
611 if ((Count < 4) || (Count & 0x01))
612 {
613 Display = DB_BYTE_DISPLAY;
614 }
615
616 /* Nasty little dump buffer routine! */
617
618 while (i < Count)
619 {
620 /* Print current offset */
621
622 AcpiOsPrintf ("%6.4X: ", i);
623
624 /* Print 16 hex chars */
625
626 for (j = 0; j < 16;)
627 {
628 if (i + j >= Count)
629 {
630 /* Dump fill spaces */
631
632 AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
633 j += Display;
634 continue;
635 }
636
637 switch (Display)
638 {
639 case DB_BYTE_DISPLAY:
640 default: /* Default is BYTE display */
641
642 AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
643 break;
644
645
646 case DB_WORD_DISPLAY:
647
648 ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
649 AcpiOsPrintf ("%04X ", Temp32);
650 break;
651
652
653 case DB_DWORD_DISPLAY:
654
655 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
656 AcpiOsPrintf ("%08X ", Temp32);
657 break;
658
659
660 case DB_QWORD_DISPLAY:
661
662 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
663 AcpiOsPrintf ("%08X", Temp32);
664
665 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
666 AcpiOsPrintf ("%08X ", Temp32);
667 break;
668 }
669
670 j += Display;
671 }
672
673 /*
674 * Print the ASCII equivalent characters but watch out for the bad
675 * unprintable ones (printable chars are 0x20 through 0x7E)
676 */
677 AcpiOsPrintf (" ");
678 for (j = 0; j < 16; j++)
679 {
680 if (i + j >= Count)
681 {
682 AcpiOsPrintf ("\n");
683 return;
684 }
685
686 BufChar = Buffer[(ACPI_SIZE) i + j];
687 if (ACPI_IS_PRINT (BufChar))
688 {
689 AcpiOsPrintf ("%c", BufChar);
690 }
691 else
692 {
693 AcpiOsPrintf (".");
694 }
695 }
696
697 /* Done with that line. */
698
699 AcpiOsPrintf ("\n");
700 i += 16;
701 }
702
703 return;
704 }
705
706
707 /*******************************************************************************
708 *
709 * FUNCTION: AcpiUtDumpBuffer
710 *
711 * PARAMETERS: Buffer - Buffer to dump
712 * Count - Amount to dump, in bytes
713 * Display - BYTE, WORD, DWORD, or QWORD display
714 * ComponentID - Caller's component ID
715 *
716 * RETURN: None
717 *
718 * DESCRIPTION: Generic dump buffer in both hex and ascii.
719 *
720 ******************************************************************************/
721
722 void
723 AcpiUtDumpBuffer (
724 UINT8 *Buffer,
725 UINT32 Count,
726 UINT32 Display,
727 UINT32 ComponentId)
728 {
729
730 /* Only dump the buffer if tracing is enabled */
731
732 if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
733 (ComponentId & AcpiDbgLayer)))
734 {
735 return;
736 }
737
738 AcpiUtDumpBuffer2 (Buffer, Count, Display);
739 }
740
741
742