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