1 /******************************************************************************
2 *
3 * Module Name: utdebug - Debug print routines
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2004, R. Byron Moore
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
45 #include <acpi/acpi.h>
46
47 #define _COMPONENT ACPI_UTILITIES
48 ACPI_MODULE_NAME ("utdebug")
49
50
51 #ifdef ACPI_DEBUG_OUTPUT
52
53 static u32 acpi_gbl_prev_thread_id = 0xFFFFFFFF;
54 static char *acpi_gbl_fn_entry_str = "----Entry";
55 static char *acpi_gbl_fn_exit_str = "----Exit-";
56
57
58 /*****************************************************************************
59 *
60 * FUNCTION: acpi_ut_init_stack_ptr_trace
61 *
62 * PARAMETERS: None
63 *
64 * RETURN: None
65 *
66 * DESCRIPTION: Save the current stack pointer
67 *
68 ****************************************************************************/
69
70 void
acpi_ut_init_stack_ptr_trace(void)71 acpi_ut_init_stack_ptr_trace (
72 void)
73 {
74 u32 current_sp;
75
76
77 acpi_gbl_entry_stack_pointer = ACPI_PTR_DIFF (¤t_sp, NULL);
78 }
79
80
81 /*****************************************************************************
82 *
83 * FUNCTION: acpi_ut_track_stack_ptr
84 *
85 * PARAMETERS: None
86 *
87 * RETURN: None
88 *
89 * DESCRIPTION: Save the current stack pointer
90 *
91 ****************************************************************************/
92
93 void
acpi_ut_track_stack_ptr(void)94 acpi_ut_track_stack_ptr (
95 void)
96 {
97 acpi_size current_sp;
98
99
100 current_sp = ACPI_PTR_DIFF (¤t_sp, NULL);
101
102 if (current_sp < acpi_gbl_lowest_stack_pointer) {
103 acpi_gbl_lowest_stack_pointer = current_sp;
104 }
105
106 if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {
107 acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;
108 }
109 }
110
111
112 /*****************************************************************************
113 *
114 * FUNCTION: acpi_ut_debug_print
115 *
116 * PARAMETERS: debug_level - Requested debug print level
117 * proc_name - Caller's procedure name
118 * module_name - Caller's module name (for error output)
119 * line_number - Caller's line number (for error output)
120 * component_id - Caller's component ID (for error output)
121 *
122 * Format - Printf format field
123 * ... - Optional printf arguments
124 *
125 * RETURN: None
126 *
127 * DESCRIPTION: Print error message with prefix consisting of the module name,
128 * line number, and component ID.
129 *
130 ****************************************************************************/
131
132 void ACPI_INTERNAL_VAR_XFACE
acpi_ut_debug_print(u32 requested_debug_level,u32 line_number,struct acpi_debug_print_info * dbg_info,char * format,...)133 acpi_ut_debug_print (
134 u32 requested_debug_level,
135 u32 line_number,
136 struct acpi_debug_print_info *dbg_info,
137 char *format,
138 ...)
139 {
140 u32 thread_id;
141 va_list args;
142
143
144 /*
145 * Stay silent if the debug level or component ID is disabled
146 */
147 if (!(requested_debug_level & acpi_dbg_level) ||
148 !(dbg_info->component_id & acpi_dbg_layer)) {
149 return;
150 }
151
152 /*
153 * Thread tracking and context switch notification
154 */
155 thread_id = acpi_os_get_thread_id ();
156
157 if (thread_id != acpi_gbl_prev_thread_id) {
158 if (ACPI_LV_THREADS & acpi_dbg_level) {
159 acpi_os_printf ("\n**** Context Switch from TID %X to TID %X ****\n\n",
160 acpi_gbl_prev_thread_id, thread_id);
161 }
162
163 acpi_gbl_prev_thread_id = thread_id;
164 }
165
166 /*
167 * Display the module name, current line number, thread ID (if requested),
168 * current procedure nesting level, and the current procedure name
169 */
170 acpi_os_printf ("%8s-%04ld ", dbg_info->module_name, line_number);
171
172 if (ACPI_LV_THREADS & acpi_dbg_level) {
173 acpi_os_printf ("[%04lX] ", thread_id);
174 }
175
176 acpi_os_printf ("[%02ld] %-22.22s: ", acpi_gbl_nesting_level, dbg_info->proc_name);
177
178 va_start (args, format);
179 acpi_os_vprintf (format, args);
180 }
181
182
183 /*****************************************************************************
184 *
185 * FUNCTION: acpi_ut_debug_print_raw
186 *
187 * PARAMETERS: requested_debug_level - Requested debug print level
188 * line_number - Caller's line number
189 * dbg_info - Contains:
190 * proc_name - Caller's procedure name
191 * module_name - Caller's module name
192 * component_id - Caller's component ID
193 * Format - Printf format field
194 * ... - Optional printf arguments
195 *
196 * RETURN: None
197 *
198 * DESCRIPTION: Print message with no headers. Has same interface as
199 * debug_print so that the same macros can be used.
200 *
201 ****************************************************************************/
202
203 void ACPI_INTERNAL_VAR_XFACE
acpi_ut_debug_print_raw(u32 requested_debug_level,u32 line_number,struct acpi_debug_print_info * dbg_info,char * format,...)204 acpi_ut_debug_print_raw (
205 u32 requested_debug_level,
206 u32 line_number,
207 struct acpi_debug_print_info *dbg_info,
208 char *format,
209 ...)
210 {
211 va_list args;
212
213
214 if (!(requested_debug_level & acpi_dbg_level) ||
215 !(dbg_info->component_id & acpi_dbg_layer)) {
216 return;
217 }
218
219 va_start (args, format);
220 acpi_os_vprintf (format, args);
221 }
222
223
224 /*****************************************************************************
225 *
226 * FUNCTION: acpi_ut_trace
227 *
228 * PARAMETERS: line_number - Caller's line number
229 * dbg_info - Contains:
230 * proc_name - Caller's procedure name
231 * module_name - Caller's module name
232 * component_id - Caller's component ID
233 *
234 * RETURN: None
235 *
236 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
237 * set in debug_level
238 *
239 ****************************************************************************/
240
241 void
acpi_ut_trace(u32 line_number,struct acpi_debug_print_info * dbg_info)242 acpi_ut_trace (
243 u32 line_number,
244 struct acpi_debug_print_info *dbg_info)
245 {
246
247 acpi_gbl_nesting_level++;
248 acpi_ut_track_stack_ptr ();
249
250 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
251 "%s\n", acpi_gbl_fn_entry_str);
252 }
253
254
255 /*****************************************************************************
256 *
257 * FUNCTION: acpi_ut_trace_ptr
258 *
259 * PARAMETERS: line_number - Caller's line number
260 * dbg_info - Contains:
261 * proc_name - Caller's procedure name
262 * module_name - Caller's module name
263 * component_id - Caller's component ID
264 * Pointer - Pointer to display
265 *
266 * RETURN: None
267 *
268 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
269 * set in debug_level
270 *
271 ****************************************************************************/
272
273 void
acpi_ut_trace_ptr(u32 line_number,struct acpi_debug_print_info * dbg_info,void * pointer)274 acpi_ut_trace_ptr (
275 u32 line_number,
276 struct acpi_debug_print_info *dbg_info,
277 void *pointer)
278 {
279 acpi_gbl_nesting_level++;
280 acpi_ut_track_stack_ptr ();
281
282 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
283 "%s %p\n", acpi_gbl_fn_entry_str, pointer);
284 }
285
286
287 /*****************************************************************************
288 *
289 * FUNCTION: acpi_ut_trace_str
290 *
291 * PARAMETERS: line_number - Caller's line number
292 * dbg_info - Contains:
293 * proc_name - Caller's procedure name
294 * module_name - Caller's module name
295 * component_id - Caller's component ID
296 * String - Additional string to display
297 *
298 * RETURN: None
299 *
300 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
301 * set in debug_level
302 *
303 ****************************************************************************/
304
305 void
acpi_ut_trace_str(u32 line_number,struct acpi_debug_print_info * dbg_info,char * string)306 acpi_ut_trace_str (
307 u32 line_number,
308 struct acpi_debug_print_info *dbg_info,
309 char *string)
310 {
311
312 acpi_gbl_nesting_level++;
313 acpi_ut_track_stack_ptr ();
314
315 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
316 "%s %s\n", acpi_gbl_fn_entry_str, string);
317 }
318
319
320 /*****************************************************************************
321 *
322 * FUNCTION: acpi_ut_trace_u32
323 *
324 * PARAMETERS: line_number - Caller's line number
325 * dbg_info - Contains:
326 * proc_name - Caller's procedure name
327 * module_name - Caller's module name
328 * component_id - Caller's component ID
329 * Integer - Integer to display
330 *
331 * RETURN: None
332 *
333 * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
334 * set in debug_level
335 *
336 ****************************************************************************/
337
338 void
acpi_ut_trace_u32(u32 line_number,struct acpi_debug_print_info * dbg_info,u32 integer)339 acpi_ut_trace_u32 (
340 u32 line_number,
341 struct acpi_debug_print_info *dbg_info,
342 u32 integer)
343 {
344
345 acpi_gbl_nesting_level++;
346 acpi_ut_track_stack_ptr ();
347
348 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
349 "%s %08X\n", acpi_gbl_fn_entry_str, integer);
350 }
351
352
353 /*****************************************************************************
354 *
355 * FUNCTION: acpi_ut_exit
356 *
357 * PARAMETERS: line_number - Caller's line number
358 * dbg_info - Contains:
359 * proc_name - Caller's procedure name
360 * module_name - Caller's module name
361 * component_id - Caller's component ID
362 *
363 * RETURN: None
364 *
365 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
366 * set in debug_level
367 *
368 ****************************************************************************/
369
370 void
acpi_ut_exit(u32 line_number,struct acpi_debug_print_info * dbg_info)371 acpi_ut_exit (
372 u32 line_number,
373 struct acpi_debug_print_info *dbg_info)
374 {
375
376 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
377 "%s\n", acpi_gbl_fn_exit_str);
378
379 acpi_gbl_nesting_level--;
380 }
381
382
383 /*****************************************************************************
384 *
385 * FUNCTION: acpi_ut_status_exit
386 *
387 * PARAMETERS: line_number - Caller's line number
388 * dbg_info - Contains:
389 * proc_name - Caller's procedure name
390 * module_name - Caller's module name
391 * component_id - Caller's component ID
392 * Status - Exit status code
393 *
394 * RETURN: None
395 *
396 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
397 * set in debug_level. Prints exit status also.
398 *
399 ****************************************************************************/
400
401 void
acpi_ut_status_exit(u32 line_number,struct acpi_debug_print_info * dbg_info,acpi_status status)402 acpi_ut_status_exit (
403 u32 line_number,
404 struct acpi_debug_print_info *dbg_info,
405 acpi_status status)
406 {
407
408 if (ACPI_SUCCESS (status)) {
409 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
410 "%s %s\n", acpi_gbl_fn_exit_str,
411 acpi_format_exception (status));
412 }
413 else {
414 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
415 "%s ****Exception****: %s\n", acpi_gbl_fn_exit_str,
416 acpi_format_exception (status));
417 }
418
419 acpi_gbl_nesting_level--;
420 }
421
422
423 /*****************************************************************************
424 *
425 * FUNCTION: acpi_ut_value_exit
426 *
427 * PARAMETERS: line_number - Caller's line number
428 * dbg_info - Contains:
429 * proc_name - Caller's procedure name
430 * module_name - Caller's module name
431 * component_id - Caller's component ID
432 * Value - Value to be printed with exit msg
433 *
434 * RETURN: None
435 *
436 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
437 * set in debug_level. Prints exit value also.
438 *
439 ****************************************************************************/
440
441 void
acpi_ut_value_exit(u32 line_number,struct acpi_debug_print_info * dbg_info,acpi_integer value)442 acpi_ut_value_exit (
443 u32 line_number,
444 struct acpi_debug_print_info *dbg_info,
445 acpi_integer value)
446 {
447
448 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
449 "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
450 ACPI_FORMAT_UINT64 (value));
451
452 acpi_gbl_nesting_level--;
453 }
454
455
456 /*****************************************************************************
457 *
458 * FUNCTION: acpi_ut_ptr_exit
459 *
460 * PARAMETERS: line_number - Caller's line number
461 * dbg_info - Contains:
462 * proc_name - Caller's procedure name
463 * module_name - Caller's module name
464 * component_id - Caller's component ID
465 * Value - Value to be printed with exit msg
466 *
467 * RETURN: None
468 *
469 * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
470 * set in debug_level. Prints exit value also.
471 *
472 ****************************************************************************/
473
474 void
acpi_ut_ptr_exit(u32 line_number,struct acpi_debug_print_info * dbg_info,u8 * ptr)475 acpi_ut_ptr_exit (
476 u32 line_number,
477 struct acpi_debug_print_info *dbg_info,
478 u8 *ptr)
479 {
480
481 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
482 "%s %p\n", acpi_gbl_fn_exit_str, ptr);
483
484 acpi_gbl_nesting_level--;
485 }
486
487 #endif
488
489
490 /*****************************************************************************
491 *
492 * FUNCTION: acpi_ut_dump_buffer
493 *
494 * PARAMETERS: Buffer - Buffer to dump
495 * Count - Amount to dump, in bytes
496 * Display - BYTE, WORD, DWORD, or QWORD display
497 * component_iD - Caller's component ID
498 *
499 * RETURN: None
500 *
501 * DESCRIPTION: Generic dump buffer in both hex and ascii.
502 *
503 ****************************************************************************/
504
505 void
acpi_ut_dump_buffer(u8 * buffer,u32 count,u32 display,u32 component_id)506 acpi_ut_dump_buffer (
507 u8 *buffer,
508 u32 count,
509 u32 display,
510 u32 component_id)
511 {
512 acpi_native_uint i = 0;
513 acpi_native_uint j;
514 u32 temp32;
515 u8 buf_char;
516
517
518 /* Only dump the buffer if tracing is enabled */
519
520 if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
521 (component_id & acpi_dbg_layer))) {
522 return;
523 }
524
525 if ((count < 4) || (count & 0x01)) {
526 display = DB_BYTE_DISPLAY;
527 }
528
529 acpi_os_printf ("\nOffset Value\n");
530
531 /*
532 * Nasty little dump buffer routine!
533 */
534 while (i < count) {
535 /* Print current offset */
536
537 acpi_os_printf ("%05X ", (u32) i);
538
539 /* Print 16 hex chars */
540
541 for (j = 0; j < 16;) {
542 if (i + j >= count) {
543 acpi_os_printf ("\n");
544 return;
545 }
546
547 /* Make sure that the s8 doesn't get sign-extended! */
548
549 switch (display) {
550 /* Default is BYTE display */
551
552 default:
553
554 acpi_os_printf ("%02X ",
555 *((u8 *) &buffer[i + j]));
556 j += 1;
557 break;
558
559
560 case DB_WORD_DISPLAY:
561
562 ACPI_MOVE_16_TO_32 (&temp32, &buffer[i + j]);
563 acpi_os_printf ("%04X ", temp32);
564 j += 2;
565 break;
566
567
568 case DB_DWORD_DISPLAY:
569
570 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]);
571 acpi_os_printf ("%08X ", temp32);
572 j += 4;
573 break;
574
575
576 case DB_QWORD_DISPLAY:
577
578 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]);
579 acpi_os_printf ("%08X", temp32);
580
581 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j + 4]);
582 acpi_os_printf ("%08X ", temp32);
583 j += 8;
584 break;
585 }
586 }
587
588 /*
589 * Print the ASCII equivalent characters
590 * But watch out for the bad unprintable ones...
591 */
592 for (j = 0; j < 16; j++) {
593 if (i + j >= count) {
594 acpi_os_printf ("\n");
595 return;
596 }
597
598 buf_char = buffer[i + j];
599 if ((buf_char > 0x1F && buf_char < 0x2E) ||
600 (buf_char > 0x2F && buf_char < 0x61) ||
601 (buf_char > 0x60 && buf_char < 0x7F)) {
602 acpi_os_printf ("%c", buf_char);
603 }
604 else {
605 acpi_os_printf (".");
606 }
607 }
608
609 /* Done with that line. */
610
611 acpi_os_printf ("\n");
612 i += 16;
613 }
614
615 return;
616 }
617
618