taskHookShow.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:6k
开发平台:

MultiPlatform

  1. /* taskHookShow.c - task hook show routines */
  2. /* Copyright 1992-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01h,15oct01,jn   use symFindSymbol for symbol lookups (SPR #7453)
  8. 01g,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  9. 01f,13feb93,kdl  changed cplusLib.h to private/cplusLibP.h (SPR #1917).
  10. 01e,02feb93,jdi  documentation tweaks.
  11. 01d,21jan93,jdi  documentation cleanup for 5.1.
  12. 01c,02aug92,srh  fixed declaration of nameToPrint
  13. 01b,01aug92,srh  added C++ demangling idiom to taskHookShow
  14. 01a,25jun92,jcf  written by extracting from taskHookLib.c.
  15. */
  16. /*
  17. This library provides routines which summarize the installed kernel
  18. hook routines.  There is one routine dedicated to the display of each 
  19. type of kernel hook:  task operation, task switch, and task deletion.
  20. The routine taskHookShowInit() links the task hook show
  21. facility into the VxWorks system.  It is called automatically when
  22. this show facility is configured into VxWorks using either of the
  23. following methods:
  24. .iP
  25. If you use the configuration header files, define
  26. INCLUDE_SHOW_ROUTINES in config.h.
  27. .iP
  28. If you use the Tornado project facility, select INCLUDE_TASK_HOOK_SHOW.
  29. INCLUDE FILES: taskHookLib.h
  30. SEE ALSO: taskHookLib,
  31. .pG "Basic OS"
  32. */
  33. #include "vxWorks.h"
  34. #include "taskHookLib.h"
  35. #include "symLib.h"
  36. #include "sysSymTbl.h"
  37. #include "stdio.h"
  38. #include "private/cplusLibP.h"
  39. #include "private/taskLibP.h"
  40. #include "private/funcBindP.h"
  41. /* defines */
  42. #define TASK_DEMANGLE_PRINT_LEN 256  /* Num chars of demangled names to print */
  43. /* forward declarations */
  44. static void taskHookShow (FUNCPTR table[], int maxEntries);
  45. /*******************************************************************************
  46. *
  47. * taskHookShowInit - initialize the task hook show facility
  48. *
  49. * This routine links the task hook show facility into the VxWorks system.
  50. * It is called automatically when the task hook show facility is
  51. * configured into VxWorks using either of the following methods:
  52. * .iP
  53. * If you use the configuration header files, define
  54. * INCLUDE_SHOW_ROUTINES in config.h.
  55. * .iP
  56. * If you use the Tornado project facility, select INCLUDE_TASK_HOOK_SHOW.
  57. *
  58. * RETURNS: N/A
  59. */
  60. void taskHookShowInit (void)
  61.     {
  62.     }
  63. /*******************************************************************************
  64. *
  65. * taskCreateHookShow - show the list of task create routines
  66. *
  67. * This routine shows all the task create routines installed in the task
  68. * create hook table, in the order in which they were installed.
  69. *
  70. * RETURNS: N/A
  71. *
  72. * SEE ALSO: taskCreateHookAdd()
  73. */
  74. void taskCreateHookShow (void)
  75.     {
  76.     taskHookShow (taskCreateTable, VX_MAX_TASK_CREATE_RTNS);
  77.     }
  78. /*******************************************************************************
  79. *
  80. * taskSwitchHookShow - show the list of task switch routines
  81. *
  82. * This routine shows all the switch routines installed in the task
  83. * switch hook table, in the order in which they were installed.
  84. *
  85. * RETURNS: N/A
  86. *
  87. * SEE ALSO: taskSwitchHookAdd()
  88. */
  89. void taskSwitchHookShow (void)
  90.     {
  91.     taskHookShow (taskSwitchTable, VX_MAX_TASK_SWITCH_RTNS);
  92.     }
  93. /*******************************************************************************
  94. *
  95. * taskSwapHookShow - show the list of task switch routines
  96. *
  97. * This routine shows all the switch routines installed in the task
  98. * switch hook table, in the order in which they were installed.
  99. *
  100. * RETURNS: N/A.
  101. *
  102. * NOMANUAL
  103. */
  104. void taskSwapHookShow (void)
  105.     {
  106.     taskHookShow (taskSwapTable, VX_MAX_TASK_SWAP_RTNS);
  107.     }
  108. /*******************************************************************************
  109. *
  110. * taskDeleteHookShow - show the list of task delete routines
  111. *
  112. * This routine shows all the delete routines installed in the task delete
  113. * hook table, in the order in which they were installed.  Note that the
  114. * delete routines will be run in reverse of the order in which they were
  115. * installed.
  116. *
  117. * RETURNS: N/A
  118. *
  119. * SEE ALSO: taskDeleteHookAdd()
  120. */
  121. void taskDeleteHookShow (void)
  122.     {
  123.     taskHookShow (taskDeleteTable, VX_MAX_TASK_DELETE_RTNS);
  124.     }
  125. /*******************************************************************************
  126. *
  127. * taskHookShow - show the hooks in a hook table
  128. *
  129. * Shows the contents of a hook table symbolically.
  130. *
  131. * RETURNS: N/A.
  132. */
  133. LOCAL void taskHookShow
  134.     (
  135.     FUNCPTR table[], /* table from which to delete */
  136.     int maxEntries /* max entries in table */
  137.     )
  138.     {
  139.     FAST      int ix;
  140.     char *    name;         /* pointer to symTbl copy of name */
  141.     int       displacement;
  142.     void *    symValue;         /* actual symbol value */
  143.     SYMBOL_ID symId;            /* symbol identifier   */
  144.     char     demangled[TASK_DEMANGLE_PRINT_LEN+1];
  145.     char *   nameToPrint;
  146.     /* 
  147.      * Only check one symLib function pointer (for performance's sake). 
  148.      * All symLib functions are provided by the same library, by convention.    
  149.      */
  150.     if ((_func_symFindSymbol !=(FUNCPTR) NULL) &&
  151. (sysSymTbl != NULL))
  152.         {
  153. for (ix = 0; ix < maxEntries; ++ix)
  154.     {
  155.     if (table [ix] == NULL)
  156.         break;
  157.     if (((* _func_symFindSymbol) (sysSymTbl,  NULL, 
  158.  (void *)table[ix], 
  159.  SYM_MASK_NONE, SYM_MASK_NONE, 
  160.  &symId) == OK) && 
  161. ((* _func_symNameGet) (symId, &name) == OK) && 
  162. ((* _func_symValueGet) (symId, &symValue) == OK)) 
  163.         {
  164. nameToPrint = cplusDemangle (name, demangled, 
  165.      sizeof (demangled));
  166. printf ("%-15s", nameToPrint);
  167. if ((displacement = (int)table[ix] - (int)symValue) != 0)
  168.     printf ("+0x%-4x", displacement);
  169. else
  170.     printf ("%6s", "");         /* no displacement */
  171. }
  172.     printf ("n");
  173.     }
  174. }
  175.     else
  176.         {
  177. for (ix = 0; ix < maxEntries; ++ix)
  178.     {
  179.     if (table [ix] == NULL)
  180.         break;
  181.     printf ("%#21x", table [ix]);
  182.     printf ("n");
  183.     }
  184. }
  185.     }