wdbDbgLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:10k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* wdbDbgLib.c - general breakpoint handling routines */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01c,08apr98,dbt  code cleanup.
  8. 01b,13mar98,dbt  added _func_wdbIsNowExternal definition.
  9. 01a,04dec97,dbt  written.
  10. */
  11. /*
  12. DESCRIPTION
  13. This library contains debugger routines. Those routines are used by both WDB
  14. debugger and target shell debugger. Although this library is part of WDB,
  15. we musn't have any reference to other WDB routines to avoid dependencies
  16. between target shell debugger and WDB.
  17. EXCEPTIONS
  18. This library contains breakpoint handlers called by the special stub
  19. routines (usually in assembly language). Those handlers choose between the
  20. target shell handlers or the WDB handlers. If WDB is not included, the
  21. target shell handler is used, otherwise we use the WDB handler.
  22. WARNING
  23. The target shell (native) debugger is based on the WDB core debugger. That's
  24. why this library is used by both debuggers. The design was studied to keep
  25. WDB and target shell independants. We must be very carefull when we modify
  26. files shared by both debuggers in order to keep the independance.
  27. Code that is share by both debuggers concerns task task handling (set
  28. breakpoints during a task switch for example). Low level routines (handle
  29. breakpoint exceptions, set breakpoint in memory, set registers for hardware
  30. breakpoints ...)
  31. The code specific to target shell debugger concerns only the interface 
  32. between the user and the breakpoint handling routine (interface to set
  33. a breakpoint, to remove a breakpoint or to display informations when a 
  34. breakpoint is encountered).
  35. Code specific to WDB core debugger concerns notification of host tools 
  36. when a breakpoint is encountered, system mode handling and interface between
  37. WDB routies and debugger routines.
  38. */
  39. /* includes */
  40. #include "vxWorks.h"
  41. #include "cacheLib.h"
  42. #include "intLib.h"
  43. #include "wdb/wdbDbgLib.h"
  44. /* globals */
  45. dll_t bpList; /* breakpoint list */
  46. dll_t   bpFreeList; /* breakpoint free list */
  47. #if DBG_NO_SINGLE_STEP
  48. FUNCPTR _func_trap = NULL; /* trap handler */
  49. #else /* DBG_NO_SINGLE_STEP */
  50. FUNCPTR _func_breakpoint = NULL; /* breakpoint handler */
  51. FUNCPTR _func_trace = NULL; /* trace handler */
  52. #endif /* DBG_NO_SINGLE_STEP */
  53. FUNCPTR _func_wdbIsNowExternal = NULL; /* pointer on wdbIsNowExternal()
  54.        routine */
  55. /******************************************************************************
  56. *
  57. * wdbDbgBpListInit - initialize the breakpoint lists
  58. *
  59. * This routine initializes the breakpoint list and the breakpoint free
  60. * list.
  61. * RETURNS : N/A
  62. *
  63. * NOMANUAL
  64. */
  65. void wdbDbgBpListInit
  66.     (
  67.     void
  68.     )
  69.     {
  70.     static BOOL bpListInitialized = FALSE;
  71.     if (!bpListInitialized)
  72. {
  73. /* initialize breakpoint list */
  74. dll_init(&bpList);
  75. /* initialize breakpoint free list */
  76. dll_init(&bpFreeList);
  77. bpListInitialized = TRUE;
  78. }
  79.     }
  80. /******************************************************************************
  81. *
  82. * wdbDbgBpGet - find info about breakpoints at some address 
  83. *
  84. * In this routine we try to find info about breakpoints at a specified
  85. * address.
  86. * If there are breakpoints at the address, this routine returns info about
  87. * the breakpoints by filling the fields of the breakpoint structure.
  88. *
  89. * IMPORTANT : This routine must be called with preemption locked.
  90. *
  91. * RETURNS: OK always.
  92. *
  93. * NOMANUAL
  94. */
  95. STATUS wdbDbgBpGet
  96.     (
  97.     INSTR * pc, /* get info for bp at this address */
  98.     int context, /* only get info for this context */
  99.     int type, /* breakpoint type */
  100.     BRKPT * pBp /* return info via this pointer */
  101.     )
  102.     {
  103.     int  action = 0; /* action associated with breakpoint */
  104.     int  flags = 0; /* breakpoint flag */
  105.     dll_t * pDll;
  106.     for (pDll = dll_head(&bpList); pDll != dll_end(&bpList);
  107. pDll = dll_next(pDll))
  108. {
  109. /* 
  110.  * We check :
  111.  * 1 - breakpoint address.
  112.  * 2 - hardware breakpoint access type (if it is a hardware
  113.  * breakpoint).
  114.  * 3 - the context ID.
  115.  */
  116. if ((BP_BASE(pDll)->bp_addr == pc) &&
  117.     ((type & (BRK_HARDWARE | BRK_HARDMASK)) ==
  118. (BP_BASE(pDll)->bp_flags & (BRK_HARDWARE | BRK_HARDMASK))) &&
  119.     ((BP_BASE(pDll)->bp_task == context) ||
  120.      ((BP_BASE(pDll)->bp_task == BP_ANY_TASK) &&
  121.       (context != BP_SYS))))
  122.     {
  123.     if (BP_BASE(pDll)->bp_count) /* count != 0 */
  124. BP_BASE(pDll)->bp_count --;
  125.     else /* count == 0 */
  126. {
  127. action |= BP_BASE(pDll)->bp_action;
  128. flags |= BP_BASE(pDll)->bp_flags;
  129. /* 
  130.  * If various breakpoints are set at the same address with 
  131.  * WDB_ACTION_CALL defined, only the latest call routine
  132.  * will be executed.
  133.  */
  134. if (BP_BASE(pDll)->bp_action & WDB_ACTION_CALL)
  135.     {
  136.     pBp->bp_callRtn = BP_BASE(pDll)->bp_callRtn;
  137.     pBp->bp_callArg = BP_BASE(pDll)->bp_callArg;
  138.     }
  139. }
  140.     }
  141. }
  142.   
  143.     /* fill action and flag fields in breakpoint structure */
  144.     pBp->bp_action = action;
  145.     pBp->bp_flags = flags;
  146.     return (OK);
  147.     }
  148. /******************************************************************************
  149. *
  150. * wdbDbgBpFind - check if there is a breakpoints at some address
  151. *
  152. * In this routine we check if there is breakpoints at a specified
  153. * address.
  154. *
  155. * IMPORTANT : This routine must be called with preemption locked.
  156. *
  157. * RETURNS: OK or ERROR if no breakpoint at that address.
  158. *
  159. * NOMANUAL
  160. */
  161. STATUS wdbDbgBpFind
  162.     (
  163.     INSTR * pc, /* get info for bp at this address */
  164.     int context /* only get info for this context */
  165.     )
  166.     {
  167.     dll_t * pDll;
  168.     for (pDll = dll_head(&bpList); pDll != dll_end(&bpList);
  169. pDll = dll_next(pDll))
  170. {
  171. if ((BP_BASE(pDll)->bp_addr == pc) &&
  172. ((BP_BASE(pDll)->bp_task == context) ||
  173. ((BP_BASE(pDll)->bp_task == BP_ANY_TASK) &&
  174.  (context != BP_SYS))))
  175.     {
  176.     return (OK);
  177.     }
  178. }
  179.     return (ERROR);
  180.     }
  181. /******************************************************************************
  182. *
  183. * wdbDbgBpRemoveAll - remove all breakpoints.
  184. *
  185. * Breakpoints are removed after a breakpoint is hit. This way
  186. * the breakpoint handler  itself won't hit a breakpoint. They are 
  187. * re-installed when the system is resumed.
  188. * Also, during a context switch this routine is called to remove task
  189. * specific breakpoints.
  190. *
  191. * IMPORTANT
  192. * This routine must be called with preemption locked.
  193. * RETURNS : N/A.  
  194. * NOMANUAL 
  195. */
  196. void wdbDbgBpRemoveAll 
  197.     (
  198.     void
  199.     )
  200.     {
  201.     dll_t * pDll;
  202. #if DBG_HARDWARE_BP
  203.     /* clean debug registers */
  204.     wdbDbgRegsClear ();
  205. #endif /* DBG_HARDWARE_BP */
  206.     /* Remove all break points. */
  207.     for (pDll = dll_head(&bpList); pDll != dll_end(&bpList);
  208.     pDll = dll_next(pDll))
  209. {
  210. if (BP_BASE(pDll)->bp_flags & BP_INSTALLED)
  211.     {
  212.     if ((BP_BASE(pDll)->bp_flags  & BRK_HARDWARE) == 0)
  213.      usrBreakpointSet (BP_BASE(pDll)->bp_addr, 
  214. BP_BASE(pDll)->bp_instr);
  215.     BP_BASE(pDll)->bp_flags &= ~BP_INSTALLED;
  216.     }
  217. }
  218.     }
  219. /******************************************************************************
  220. *
  221. * wdbDbgBpRemove - remove a specific breakpoint.
  222. *
  223. * This routine removes a breakpoint. It first restore original instruction,
  224. * then remove it from breakpoint list and add it in breakpoint free list.
  225. *
  226. * IMPORTANT : This routine must be called with preemption locked.
  227. *
  228. * RETURNS : OK always.
  229. *
  230. * NOMANUAL
  231. */
  232. STATUS wdbDbgBpRemove 
  233.     (
  234.     BRKPT * pBp /* breakpoint to remove */
  235.     )
  236.     {
  237.     dll_remove(&pBp->bp_chain);
  238.     /* remove this breakpoint from memory if it is installed */
  239.     if ((pBp->bp_flags & BP_INSTALLED) && ((pBp->bp_flags & BRK_HARDWARE) == 0))
  240. usrBreakpointSet (pBp->bp_addr, pBp->bp_instr);
  241.     dll_insert (&pBp->bp_chain, &bpFreeList);
  242.     return (OK);
  243.     }
  244. #if DBG_NO_SINGLE_STEP
  245. /*******************************************************************************
  246. *
  247. * wdbDbgTrap - handle hitting of breakpoint
  248. *
  249. * This routine handles the breakpoint trap.  It is called only from its
  250. * special stub routine (usually in assembly language) which is connected
  251. * to the breakpoint trap. It is used by targets that have to multiplex
  252. * tracing and breakpoint.
  253. *
  254. * RETURNS : N/A
  255. *
  256. * NOMANUAL
  257. */
  258. void wdbDbgTrap
  259.     (
  260.     INSTR * addr, /* pc value */
  261.     REG_SET * pRegisters, /* task registers before breakpoint exception */
  262.     void * pInfo, /* pointer on info */
  263.     void * pDbgRegSet, /* pointer to debug register set */
  264.     BOOL hardware /* indicates if it is a hardware breakpoint */
  265.     )
  266.     {
  267.     int  level; /* level of interupt lock */
  268.     level = intLock ();
  269.     /* call the trap handler */
  270.     if (_func_trap != NULL)
  271. _func_trap (level, addr, pInfo, pRegisters, pDbgRegSet, hardware);
  272.     }
  273. #else  /* DBG_NO_SINGLE_STEP */
  274. /*******************************************************************************
  275. *
  276. * wdbDbgTrace - handle trace exception
  277. *
  278. * This routine handles the trace trap.  It is called only
  279. * from its special assembly language stub routine which is connected
  280. * to the trace trap.
  281. *
  282. * RETURNS : N/A
  283. *
  284. * NOMANUAL
  285. */
  286. void wdbDbgTrace
  287.     (
  288.     void * pInfo, /* pointer on info */
  289.     REG_SET * pRegisters /* task registers before breakpoint exception */
  290.     )
  291.     {
  292.     int level; /* level of interupt lock */
  293.     level = intLock ();
  294.     /* call the trace handler */
  295.     if (_func_trace != NULL)
  296. _func_trace (level, pInfo, pRegisters);
  297.     }
  298. /*******************************************************************************
  299. *
  300. * wdbDbgBreakpoint - handle hitting of breakpoint
  301. *
  302. * This routine handles the breakpoint trap.  It is called only from its
  303. * special stub routine (usually in assembly language) which is connected
  304. * to the breakpoint trap.
  305. *
  306. * RETURNS : N/A
  307. *
  308. * NOMANUAL
  309. */
  310. void wdbDbgBreakpoint
  311.     (
  312.     void * pInfo, /* pointer on info */
  313.     REG_SET * pRegisters, /* pointer to register set */
  314.     void * pDbgRegSet, /* pointer to debug registers */
  315.     BOOL hardware /* indicates if it is a hardware breakpoint */
  316.     )
  317.     {
  318.     int level; /* level of interrupt lock */
  319.     
  320.     level = intLock ();
  321.     /* Remove all break points */
  322.     wdbDbgBpRemoveAll();
  323.     /* call the breakpoint handler */
  324.     if (_func_breakpoint != NULL)
  325. _func_breakpoint (level, pInfo, pRegisters, pDbgRegSet, hardware);
  326.     }
  327. #endif /* DBG_NO_SINGLE_STEP */