Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 stack pointer
 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 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:  debug_level         - Requested debug print level
118  *              proc_name           - Caller's procedure name
119  *              module_name         - Caller's module name (for error output)
120  *              line_number         - Caller's line number (for error output)
121  *              component_id        - Caller's component ID (for error output)
122  *
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 ("\n**** Context Switch from TID %X to TID %X ****\n\n",
161                                 acpi_gbl_prev_thread_id, thread_id);
162                 }
163 
164                 acpi_gbl_prev_thread_id = thread_id;
165         }
166 
167         /*
168          * Display the module name, current line number, thread ID (if requested),
169          * current procedure nesting level, and the current procedure name
170          */
171         acpi_os_printf ("%8s-%04ld ", dbg_info->module_name, line_number);
172 
173         if (ACPI_LV_THREADS & acpi_dbg_level) {
174                 acpi_os_printf ("[%04lX] ", thread_id);
175         }
176 
177         acpi_os_printf ("[%02ld] %-22.22s: ", acpi_gbl_nesting_level, dbg_info->proc_name);
178 
179         va_start (args, format);
180         acpi_os_vprintf (format, args);
181 }
182 EXPORT_SYMBOL(acpi_ut_debug_print);
183 
184 
185 /*****************************************************************************
186  *
187  * FUNCTION:    acpi_ut_debug_print_raw
188  *
189  * PARAMETERS:  requested_debug_level - Requested debug print level
190  *              line_number         - Caller's line number
191  *              dbg_info            - Contains:
192  *                  proc_name           - Caller's procedure name
193  *                  module_name         - Caller's module name
194  *                  component_id        - Caller's component ID
195  *              Format              - Printf format field
196  *              ...                 - Optional printf arguments
197  *
198  * RETURN:      None
199  *
200  * DESCRIPTION: Print message with no headers.  Has same interface as
201  *              debug_print so that the same macros can be used.
202  *
203  ****************************************************************************/
204 
205 void  ACPI_INTERNAL_VAR_XFACE
206 acpi_ut_debug_print_raw (
207         u32                             requested_debug_level,
208         u32                             line_number,
209         struct acpi_debug_print_info    *dbg_info,
210         char                            *format,
211         ...)
212 {
213         va_list                 args;
214 
215 
216         if (!(requested_debug_level & acpi_dbg_level) ||
217                 !(dbg_info->component_id & acpi_dbg_layer)) {
218                 return;
219         }
220 
221         va_start (args, format);
222         acpi_os_vprintf (format, args);
223 }
224 EXPORT_SYMBOL(acpi_ut_debug_print_raw);
225 
226 
227 /*****************************************************************************
228  *
229  * FUNCTION:    acpi_ut_trace
230  *
231  * PARAMETERS:  line_number         - Caller's line number
232  *              dbg_info            - Contains:
233  *                  proc_name           - Caller's procedure name
234  *                  module_name         - Caller's module name
235  *                  component_id        - Caller's component ID
236  *
237  * RETURN:      None
238  *
239  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
240  *              set in debug_level
241  *
242  ****************************************************************************/
243 
244 void
245 acpi_ut_trace (
246         u32                             line_number,
247         struct acpi_debug_print_info    *dbg_info)
248 {
249 
250         acpi_gbl_nesting_level++;
251         acpi_ut_track_stack_ptr ();
252 
253         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
254                         "%s\n", acpi_gbl_fn_entry_str);
255 }
256 EXPORT_SYMBOL(acpi_ut_trace);
257 
258 
259 /*****************************************************************************
260  *
261  * FUNCTION:    acpi_ut_trace_ptr
262  *
263  * PARAMETERS:  line_number         - Caller's line number
264  *              dbg_info            - Contains:
265  *                  proc_name           - Caller's procedure name
266  *                  module_name         - Caller's module name
267  *                  component_id        - Caller's component ID
268  *              Pointer             - Pointer to display
269  *
270  * RETURN:      None
271  *
272  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
273  *              set in debug_level
274  *
275  ****************************************************************************/
276 
277 void
278 acpi_ut_trace_ptr (
279         u32                             line_number,
280         struct acpi_debug_print_info    *dbg_info,
281         void                            *pointer)
282 {
283         acpi_gbl_nesting_level++;
284         acpi_ut_track_stack_ptr ();
285 
286         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
287                         "%s %p\n", acpi_gbl_fn_entry_str, pointer);
288 }
289 
290 
291 /*****************************************************************************
292  *
293  * FUNCTION:    acpi_ut_trace_str
294  *
295  * PARAMETERS:  line_number         - Caller's line number
296  *              dbg_info            - Contains:
297  *                  proc_name           - Caller's procedure name
298  *                  module_name         - Caller's module name
299  *                  component_id        - Caller's component ID
300  *              String              - Additional string to display
301  *
302  * RETURN:      None
303  *
304  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
305  *              set in debug_level
306  *
307  ****************************************************************************/
308 
309 void
310 acpi_ut_trace_str (
311         u32                             line_number,
312         struct acpi_debug_print_info    *dbg_info,
313         char                            *string)
314 {
315 
316         acpi_gbl_nesting_level++;
317         acpi_ut_track_stack_ptr ();
318 
319         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
320                         "%s %s\n", acpi_gbl_fn_entry_str, string);
321 }
322 
323 
324 /*****************************************************************************
325  *
326  * FUNCTION:    acpi_ut_trace_u32
327  *
328  * PARAMETERS:  line_number         - Caller's line number
329  *              dbg_info            - Contains:
330  *                  proc_name           - Caller's procedure name
331  *                  module_name         - Caller's module name
332  *                  component_id        - Caller's component ID
333  *              Integer             - Integer to display
334  *
335  * RETURN:      None
336  *
337  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
338  *              set in debug_level
339  *
340  ****************************************************************************/
341 
342 void
343 acpi_ut_trace_u32 (
344         u32                             line_number,
345         struct acpi_debug_print_info    *dbg_info,
346         u32                             integer)
347 {
348 
349         acpi_gbl_nesting_level++;
350         acpi_ut_track_stack_ptr ();
351 
352         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
353                         "%s %08X\n", acpi_gbl_fn_entry_str, integer);
354 }
355 
356 
357 /*****************************************************************************
358  *
359  * FUNCTION:    acpi_ut_exit
360  *
361  * PARAMETERS:  line_number         - Caller's line number
362  *              dbg_info            - Contains:
363  *                  proc_name           - Caller's procedure name
364  *                  module_name         - Caller's module name
365  *                  component_id        - Caller's component ID
366  *
367  * RETURN:      None
368  *
369  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
370  *              set in debug_level
371  *
372  ****************************************************************************/
373 
374 void
375 acpi_ut_exit (
376         u32                             line_number,
377         struct acpi_debug_print_info    *dbg_info)
378 {
379 
380         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
381                         "%s\n", acpi_gbl_fn_exit_str);
382 
383         acpi_gbl_nesting_level--;
384 }
385 EXPORT_SYMBOL(acpi_ut_exit);
386 
387 
388 /*****************************************************************************
389  *
390  * FUNCTION:    acpi_ut_status_exit
391  *
392  * PARAMETERS:  line_number         - Caller's line number
393  *              dbg_info            - Contains:
394  *                  proc_name           - Caller's procedure name
395  *                  module_name         - Caller's module name
396  *                  component_id        - Caller's component ID
397  *              Status              - Exit status code
398  *
399  * RETURN:      None
400  *
401  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
402  *              set in debug_level. Prints exit status also.
403  *
404  ****************************************************************************/
405 
406 void
407 acpi_ut_status_exit (
408         u32                             line_number,
409         struct acpi_debug_print_info    *dbg_info,
410         acpi_status                     status)
411 {
412 
413         if (ACPI_SUCCESS (status)) {
414                 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
415                                 "%s %s\n", acpi_gbl_fn_exit_str,
416                                 acpi_format_exception (status));
417         }
418         else {
419                 acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
420                                 "%s ****Exception****: %s\n", acpi_gbl_fn_exit_str,
421                                 acpi_format_exception (status));
422         }
423 
424         acpi_gbl_nesting_level--;
425 }
426 EXPORT_SYMBOL(acpi_ut_status_exit);
427 
428 
429 /*****************************************************************************
430  *
431  * FUNCTION:    acpi_ut_value_exit
432  *
433  * PARAMETERS:  line_number         - Caller's line number
434  *              dbg_info            - Contains:
435  *                  proc_name           - Caller's procedure name
436  *                  module_name         - Caller's module name
437  *                  component_id        - Caller's component ID
438  *              Value               - Value to be printed with exit msg
439  *
440  * RETURN:      None
441  *
442  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
443  *              set in debug_level. Prints exit value also.
444  *
445  ****************************************************************************/
446 
447 void
448 acpi_ut_value_exit (
449         u32                             line_number,
450         struct acpi_debug_print_info    *dbg_info,
451         acpi_integer                    value)
452 {
453 
454         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
455                         "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
456                         ACPI_FORMAT_UINT64 (value));
457 
458         acpi_gbl_nesting_level--;
459 }
460 EXPORT_SYMBOL(acpi_ut_value_exit);
461 
462 
463 /*****************************************************************************
464  *
465  * FUNCTION:    acpi_ut_ptr_exit
466  *
467  * PARAMETERS:  line_number         - Caller's line number
468  *              dbg_info            - Contains:
469  *                  proc_name           - Caller's procedure name
470  *                  module_name         - Caller's module name
471  *                  component_id        - Caller's component ID
472  *              Value               - Value to be printed with exit msg
473  *
474  * RETURN:      None
475  *
476  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
477  *              set in debug_level. Prints exit value also.
478  *
479  ****************************************************************************/
480 
481 void
482 acpi_ut_ptr_exit (
483         u32                             line_number,
484         struct acpi_debug_print_info    *dbg_info,
485         u8                              *ptr)
486 {
487 
488         acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
489                         "%s %p\n", acpi_gbl_fn_exit_str, ptr);
490 
491         acpi_gbl_nesting_level--;
492 }
493 
494 #endif
495 
496 
497 /*****************************************************************************
498  *
499  * FUNCTION:    acpi_ut_dump_buffer
500  *
501  * PARAMETERS:  Buffer              - Buffer to dump
502  *              Count               - Amount to dump, in bytes
503  *              Display             - BYTE, WORD, DWORD, or QWORD display
504  *              component_iD        - Caller's component ID
505  *
506  * RETURN:      None
507  *
508  * DESCRIPTION: Generic dump buffer in both hex and ascii.
509  *
510  ****************************************************************************/
511 
512 void
513 acpi_ut_dump_buffer (
514         u8                              *buffer,
515         u32                             count,
516         u32                             display,
517         u32                             component_id)
518 {
519         acpi_native_uint                i = 0;
520         acpi_native_uint                j;
521         u32                             temp32;
522         u8                              buf_char;
523 
524 
525         /* Only dump the buffer if tracing is enabled */
526 
527         if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
528                 (component_id & acpi_dbg_layer))) {
529                 return;
530         }
531 
532         if ((count < 4) || (count & 0x01)) {
533                 display = DB_BYTE_DISPLAY;
534         }
535 
536         acpi_os_printf ("\nOffset Value\n");
537 
538         /*
539          * Nasty little dump buffer routine!
540          */
541         while (i < count) {
542                 /* Print current offset */
543 
544                 acpi_os_printf ("%05X  ", (u32) i);
545 
546                 /* Print 16 hex chars */
547 
548                 for (j = 0; j < 16;) {
549                         if (i + j >= count) {
550                                 acpi_os_printf ("\n");
551                                 return;
552                         }
553 
554                         /* Make sure that the s8 doesn't get sign-extended! */
555 
556                         switch (display) {
557                         /* Default is BYTE display */
558 
559                         default:
560 
561                                 acpi_os_printf ("%02X ",
562                                                 *((u8 *) &buffer[i + j]));
563                                 j += 1;
564                                 break;
565 
566 
567                         case DB_WORD_DISPLAY:
568 
569                                 ACPI_MOVE_16_TO_32 (&temp32, &buffer[i + j]);
570                                 acpi_os_printf ("%04X ", temp32);
571                                 j += 2;
572                                 break;
573 
574 
575                         case DB_DWORD_DISPLAY:
576 
577                                 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]);
578                                 acpi_os_printf ("%08X ", temp32);
579                                 j += 4;
580                                 break;
581 
582 
583                         case DB_QWORD_DISPLAY:
584 
585                                 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j]);
586                                 acpi_os_printf ("%08X", temp32);
587 
588                                 ACPI_MOVE_32_TO_32 (&temp32, &buffer[i + j + 4]);
589                                 acpi_os_printf ("%08X ", temp32);
590                                 j += 8;
591                                 break;
592                         }
593                 }
594 
595                 /*
596                  * Print the ASCII equivalent characters
597                  * But watch out for the bad unprintable ones...
598                  */
599                 for (j = 0; j < 16; j++) {
600                         if (i + j >= count) {
601                                 acpi_os_printf ("\n");
602                                 return;
603                         }
604 
605                         buf_char = buffer[i + j];
606                         if ((buf_char > 0x1F && buf_char < 0x2E) ||
607                                 (buf_char > 0x2F && buf_char < 0x61) ||
608                                 (buf_char > 0x60 && buf_char < 0x7F)) {
609                                 acpi_os_printf ("%c", buf_char);
610                         }
611                         else {
612                                 acpi_os_printf (".");
613                         }
614                 }
615 
616                 /* Done with that line. */
617 
618                 acpi_os_printf ("\n");
619                 i += 16;
620         }
621 
622         return;
623 }
624 
625 
  This page was automatically generated by the LXR engine.