utdebug.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:16k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utdebug - Debug print routines
  4.  *              $Revision: 90 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #define _COMPONENT          ACPI_UTILITIES
  26.  MODULE_NAME         ("utdebug")
  27. u32             acpi_gbl_prev_thread_id = 0xFFFFFFFF;
  28. char            *acpi_gbl_fn_entry_str = "----Entry";
  29. char            *acpi_gbl_fn_exit_str = "----Exit-";
  30. #ifdef ACPI_DEBUG
  31. /*****************************************************************************
  32.  *
  33.  * FUNCTION:    Acpi_ut_init_stack_ptr_trace
  34.  *
  35.  * PARAMETERS:  None
  36.  *
  37.  * RETURN:      None
  38.  *
  39.  * DESCRIPTION: Save the current stack pointer
  40.  *
  41.  ****************************************************************************/
  42. void
  43. acpi_ut_init_stack_ptr_trace (
  44. void)
  45. {
  46. u32                 current_sp;
  47. acpi_gbl_entry_stack_pointer = (u32) &current_sp;
  48. }
  49. /*****************************************************************************
  50.  *
  51.  * FUNCTION:    Acpi_ut_track_stack_ptr
  52.  *
  53.  * PARAMETERS:  None
  54.  *
  55.  * RETURN:      None
  56.  *
  57.  * DESCRIPTION: Save the current stack pointer
  58.  *
  59.  ****************************************************************************/
  60. void
  61. acpi_ut_track_stack_ptr (
  62. void)
  63. {
  64. u32                 current_sp;
  65. current_sp = (u32) &current_sp;
  66. if (current_sp < acpi_gbl_lowest_stack_pointer) {
  67. acpi_gbl_lowest_stack_pointer = current_sp;
  68. }
  69. if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) {
  70. acpi_gbl_deepest_nesting = acpi_gbl_nesting_level;
  71. }
  72. }
  73. /*****************************************************************************
  74.  *
  75.  * FUNCTION:    Acpi_ut_debug_print
  76.  *
  77.  * PARAMETERS:  Debug_level         - Requested debug print level
  78.  *              Proc_name           - Caller's procedure name
  79.  *              Module_name         - Caller's module name (for error output)
  80.  *              Line_number         - Caller's line number (for error output)
  81.  *              Component_id        - Caller's component ID (for error output)
  82.  *
  83.  *              Format              - Printf format field
  84.  *              ...                 - Optional printf arguments
  85.  *
  86.  * RETURN:      None
  87.  *
  88.  * DESCRIPTION: Print error message with prefix consisting of the module name,
  89.  *              line number, and component ID.
  90.  *
  91.  ****************************************************************************/
  92. void
  93. acpi_ut_debug_print (
  94. u32                     requested_debug_level,
  95. u32                     line_number,
  96. acpi_debug_print_info   *dbg_info,
  97. char                    *format,
  98. ...)
  99. {
  100. u32                     thread_id;
  101. va_list                 args;
  102. /*
  103.  * Stay silent if the debug level or component ID is disabled
  104.  */
  105. if (!(requested_debug_level & acpi_dbg_level) ||
  106. !(dbg_info->component_id & acpi_dbg_layer)) {
  107. return;
  108. }
  109. /*
  110.  * Thread tracking and context switch notification
  111.  */
  112. thread_id = acpi_os_get_thread_id ();
  113. if (thread_id != acpi_gbl_prev_thread_id) {
  114. if (ACPI_LV_THREADS & acpi_dbg_level) {
  115. acpi_os_printf ("n**** Context Switch from TID %X to TID %X ****nn",
  116. acpi_gbl_prev_thread_id, thread_id);
  117. }
  118. acpi_gbl_prev_thread_id = thread_id;
  119. }
  120. /*
  121.  * Display the module name, current line number, thread ID (if requested),
  122.  * current procedure nesting level, and the current procedure name
  123.  */
  124. acpi_os_printf ("%8s-%04d ", dbg_info->module_name, line_number);
  125. if (ACPI_LV_THREADS & acpi_dbg_level) {
  126. acpi_os_printf ("[%04X] ", thread_id, acpi_gbl_nesting_level, dbg_info->proc_name);
  127. }
  128. acpi_os_printf ("[%02d] %-22.22s: ", acpi_gbl_nesting_level, dbg_info->proc_name);
  129. va_start (args, format);
  130. acpi_os_vprintf (format, args);
  131. }
  132. /*****************************************************************************
  133.  *
  134.  * FUNCTION:    Acpi_ut_debug_print_raw
  135.  *
  136.  * PARAMETERS:  Requested_debug_level - Requested debug print level
  137.  *              Line_number         - Caller's line number
  138.  *              Dbg_info            - Contains:
  139.  *                  Proc_name           - Caller's procedure name
  140.  *                  Module_name         - Caller's module name
  141.  *                  Component_id        - Caller's component ID
  142.  *              Format              - Printf format field
  143.  *              ...                 - Optional printf arguments
  144.  *
  145.  * RETURN:      None
  146.  *
  147.  * DESCRIPTION: Print message with no headers.  Has same interface as
  148.  *              Debug_print so that the same macros can be used.
  149.  *
  150.  ****************************************************************************/
  151. void
  152. acpi_ut_debug_print_raw (
  153. u32                     requested_debug_level,
  154. u32                     line_number,
  155. acpi_debug_print_info   *dbg_info,
  156. char                    *format,
  157. ...)
  158. {
  159. va_list                 args;
  160. if (!(requested_debug_level & acpi_dbg_level) ||
  161. !(dbg_info->component_id & acpi_dbg_layer)) {
  162. return;
  163. }
  164. va_start (args, format);
  165. acpi_os_vprintf (format, args);
  166. }
  167. /*****************************************************************************
  168.  *
  169.  * FUNCTION:    Acpi_ut_trace
  170.  *
  171.  * PARAMETERS:  Line_number         - Caller's line number
  172.  *              Dbg_info            - Contains:
  173.  *                  Proc_name           - Caller's procedure name
  174.  *                  Module_name         - Caller's module name
  175.  *                  Component_id        - Caller's component ID
  176.  *
  177.  * RETURN:      None
  178.  *
  179.  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
  180.  *              set in Debug_level
  181.  *
  182.  ****************************************************************************/
  183. void
  184. acpi_ut_trace (
  185. u32                     line_number,
  186. acpi_debug_print_info   *dbg_info)
  187. {
  188. acpi_gbl_nesting_level++;
  189. acpi_ut_track_stack_ptr ();
  190. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  191. "%sn", acpi_gbl_fn_entry_str);
  192. }
  193. /*****************************************************************************
  194.  *
  195.  * FUNCTION:    Acpi_ut_trace_ptr
  196.  *
  197.  * PARAMETERS:  Line_number         - Caller's line number
  198.  *              Dbg_info            - Contains:
  199.  *                  Proc_name           - Caller's procedure name
  200.  *                  Module_name         - Caller's module name
  201.  *                  Component_id        - Caller's component ID
  202.  *              Pointer             - Pointer to display
  203.  *
  204.  * RETURN:      None
  205.  *
  206.  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
  207.  *              set in Debug_level
  208.  *
  209.  ****************************************************************************/
  210. void
  211. acpi_ut_trace_ptr (
  212. u32                     line_number,
  213. acpi_debug_print_info   *dbg_info,
  214. void                    *pointer)
  215. {
  216. acpi_gbl_nesting_level++;
  217. acpi_ut_track_stack_ptr ();
  218. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  219. "%s %pn", acpi_gbl_fn_entry_str, pointer);
  220. }
  221. /*****************************************************************************
  222.  *
  223.  * FUNCTION:    Acpi_ut_trace_str
  224.  *
  225.  * PARAMETERS:  Line_number         - Caller's line number
  226.  *              Dbg_info            - Contains:
  227.  *                  Proc_name           - Caller's procedure name
  228.  *                  Module_name         - Caller's module name
  229.  *                  Component_id        - Caller's component ID
  230.  *              String              - Additional string to display
  231.  *
  232.  * RETURN:      None
  233.  *
  234.  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
  235.  *              set in Debug_level
  236.  *
  237.  ****************************************************************************/
  238. void
  239. acpi_ut_trace_str (
  240. u32                     line_number,
  241. acpi_debug_print_info   *dbg_info,
  242. NATIVE_CHAR             *string)
  243. {
  244. acpi_gbl_nesting_level++;
  245. acpi_ut_track_stack_ptr ();
  246. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  247. "%s %sn", acpi_gbl_fn_entry_str, string);
  248. }
  249. /*****************************************************************************
  250.  *
  251.  * FUNCTION:    Acpi_ut_trace_u32
  252.  *
  253.  * PARAMETERS:  Line_number         - Caller's line number
  254.  *              Dbg_info            - Contains:
  255.  *                  Proc_name           - Caller's procedure name
  256.  *                  Module_name         - Caller's module name
  257.  *                  Component_id        - Caller's component ID
  258.  *              Integer             - Integer to display
  259.  *
  260.  * RETURN:      None
  261.  *
  262.  * DESCRIPTION: Function entry trace.  Prints only if TRACE_FUNCTIONS bit is
  263.  *              set in Debug_level
  264.  *
  265.  ****************************************************************************/
  266. void
  267. acpi_ut_trace_u32 (
  268. u32                     line_number,
  269. acpi_debug_print_info   *dbg_info,
  270. u32                     integer)
  271. {
  272. acpi_gbl_nesting_level++;
  273. acpi_ut_track_stack_ptr ();
  274. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  275. "%s %08Xn", acpi_gbl_fn_entry_str, integer);
  276. }
  277. /*****************************************************************************
  278.  *
  279.  * FUNCTION:    Acpi_ut_exit
  280.  *
  281.  * PARAMETERS:  Line_number         - Caller's line number
  282.  *              Dbg_info            - Contains:
  283.  *                  Proc_name           - Caller's procedure name
  284.  *                  Module_name         - Caller's module name
  285.  *                  Component_id        - Caller's component ID
  286.  *
  287.  * RETURN:      None
  288.  *
  289.  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
  290.  *              set in Debug_level
  291.  *
  292.  ****************************************************************************/
  293. void
  294. acpi_ut_exit (
  295. u32                     line_number,
  296. acpi_debug_print_info   *dbg_info)
  297. {
  298. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  299. "%sn", acpi_gbl_fn_exit_str);
  300. acpi_gbl_nesting_level--;
  301. }
  302. /*****************************************************************************
  303.  *
  304.  * FUNCTION:    Acpi_ut_status_exit
  305.  *
  306.  * PARAMETERS:  Line_number         - Caller's line number
  307.  *              Dbg_info            - Contains:
  308.  *                  Proc_name           - Caller's procedure name
  309.  *                  Module_name         - Caller's module name
  310.  *                  Component_id        - Caller's component ID
  311.  *              Status              - Exit status code
  312.  *
  313.  * RETURN:      None
  314.  *
  315.  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
  316.  *              set in Debug_level. Prints exit status also.
  317.  *
  318.  ****************************************************************************/
  319. void
  320. acpi_ut_status_exit (
  321. u32                     line_number,
  322. acpi_debug_print_info   *dbg_info,
  323. acpi_status             status)
  324. {
  325. if (ACPI_SUCCESS (status)) {
  326. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  327. "%s %sn", acpi_gbl_fn_exit_str,
  328. acpi_format_exception (status));
  329. }
  330. else {
  331. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  332. "%s ****Exception****: %sn", acpi_gbl_fn_exit_str,
  333. acpi_format_exception (status));
  334. }
  335. acpi_gbl_nesting_level--;
  336. }
  337. /*****************************************************************************
  338.  *
  339.  * FUNCTION:    Acpi_ut_value_exit
  340.  *
  341.  * PARAMETERS:  Line_number         - Caller's line number
  342.  *              Dbg_info            - Contains:
  343.  *                  Proc_name           - Caller's procedure name
  344.  *                  Module_name         - Caller's module name
  345.  *                  Component_id        - Caller's component ID
  346.  *              Value               - Value to be printed with exit msg
  347.  *
  348.  * RETURN:      None
  349.  *
  350.  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
  351.  *              set in Debug_level. Prints exit value also.
  352.  *
  353.  ****************************************************************************/
  354. void
  355. acpi_ut_value_exit (
  356. u32                     line_number,
  357. acpi_debug_print_info   *dbg_info,
  358. acpi_integer            value)
  359. {
  360. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  361. "%s %8.8X%8.8Xn", acpi_gbl_fn_exit_str, HIDWORD(value), LODWORD(value));
  362. acpi_gbl_nesting_level--;
  363. }
  364. /*****************************************************************************
  365.  *
  366.  * FUNCTION:    Acpi_ut_ptr_exit
  367.  *
  368.  * PARAMETERS:  Line_number         - Caller's line number
  369.  *              Dbg_info            - Contains:
  370.  *                  Proc_name           - Caller's procedure name
  371.  *                  Module_name         - Caller's module name
  372.  *                  Component_id        - Caller's component ID
  373.  *              Value               - Value to be printed with exit msg
  374.  *
  375.  * RETURN:      None
  376.  *
  377.  * DESCRIPTION: Function exit trace.  Prints only if TRACE_FUNCTIONS bit is
  378.  *              set in Debug_level. Prints exit value also.
  379.  *
  380.  ****************************************************************************/
  381. void
  382. acpi_ut_ptr_exit (
  383. u32                     line_number,
  384. acpi_debug_print_info   *dbg_info,
  385. u8                      *ptr)
  386. {
  387. acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
  388. "%s %pn", acpi_gbl_fn_exit_str, ptr);
  389. acpi_gbl_nesting_level--;
  390. }
  391. #endif
  392. /*****************************************************************************
  393.  *
  394.  * FUNCTION:    Acpi_ut_dump_buffer
  395.  *
  396.  * PARAMETERS:  Buffer              - Buffer to dump
  397.  *              Count               - Amount to dump, in bytes
  398.  *              Display             - BYTE, WORD, DWORD, or QWORD display
  399.  *              Component_iD        - Caller's component ID
  400.  *
  401.  * RETURN:      None
  402.  *
  403.  * DESCRIPTION: Generic dump buffer in both hex and ascii.
  404.  *
  405.  ****************************************************************************/
  406. void
  407. acpi_ut_dump_buffer (
  408. u8                      *buffer,
  409. u32                     count,
  410. u32                     display,
  411. u32                     component_id)
  412. {
  413. u32                     i = 0;
  414. u32                     j;
  415. u32                     temp32;
  416. u8                      buf_char;
  417. /* Only dump the buffer if tracing is enabled */
  418. if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
  419. (component_id & acpi_dbg_layer))) {
  420. return;
  421. }
  422. /*
  423.  * Nasty little dump buffer routine!
  424.  */
  425. while (i < count) {
  426. /* Print current offset */
  427. acpi_os_printf ("%05X  ", i);
  428. /* Print 16 hex chars */
  429. for (j = 0; j < 16;) {
  430. if (i + j >= count) {
  431. acpi_os_printf ("n");
  432. return;
  433. }
  434. /* Make sure that the s8 doesn't get sign-extended! */
  435. switch (display) {
  436. /* Default is BYTE display */
  437. default:
  438. acpi_os_printf ("%02X ",
  439. *((u8 *) &buffer[i + j]));
  440. j += 1;
  441. break;
  442. case DB_WORD_DISPLAY:
  443. MOVE_UNALIGNED16_TO_32 (&temp32,
  444.  &buffer[i + j]);
  445. acpi_os_printf ("%04X ", temp32);
  446. j += 2;
  447. break;
  448. case DB_DWORD_DISPLAY:
  449. MOVE_UNALIGNED32_TO_32 (&temp32,
  450.  &buffer[i + j]);
  451. acpi_os_printf ("%08X ", temp32);
  452. j += 4;
  453. break;
  454. case DB_QWORD_DISPLAY:
  455. MOVE_UNALIGNED32_TO_32 (&temp32,
  456.  &buffer[i + j]);
  457. acpi_os_printf ("%08X", temp32);
  458. MOVE_UNALIGNED32_TO_32 (&temp32,
  459.  &buffer[i + j + 4]);
  460. acpi_os_printf ("%08X ", temp32);
  461. j += 8;
  462. break;
  463. }
  464. }
  465. /*
  466.  * Print the ASCII equivalent characters
  467.  * But watch out for the bad unprintable ones...
  468.  */
  469. for (j = 0; j < 16; j++) {
  470. if (i + j >= count) {
  471. acpi_os_printf ("n");
  472. return;
  473. }
  474. buf_char = buffer[i + j];
  475. if ((buf_char > 0x1F && buf_char < 0x2E) ||
  476. (buf_char > 0x2F && buf_char < 0x61) ||
  477. (buf_char > 0x60 && buf_char < 0x7F)) {
  478. acpi_os_printf ("%c", buf_char);
  479. }
  480. else {
  481. acpi_os_printf (".");
  482. }
  483. }
  484. /* Done with that line. */
  485. acpi_os_printf ("n");
  486. i += 16;
  487. }
  488. return;
  489. }