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

VxWorks

开发平台:

C/C++

  1. /* wdbTaskBpLib.c - Break point handing for the target server */
  2. /* Copyright 1994-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01o,09nov01,jhw  Revert WDB_INFO to be inside WIND_TCB.
  7. 01n,17oct01,jhw  Access WDB_INFO through WIND_TCB pointer.
  8. 01m,21apr98,dbt  code cleanup.
  9. 01l,06nov97,dbt  merge with target shell debugger.
  10. 01k,15jul96,ms   fixed problem with trace mode
  11. 01j,26jun96,ms   2nd paramter to eventpoint call func is now a REG_SET *.
  12.  breakpointIgnore routine no longer checks for VX_UNBREAKABLE.
  13. 01i,04jun96,kkk  replace _sigCtxLoad() with WDB_CTX_LOAD().
  14. 01h,25apr96,ms   support generalized eventPoint handling
  15.  support multiple breakpoints at same address
  16.  lots of cleanup
  17. 01f,23jan96,tpr  added casts to compile with Diab Data tools.
  18. 01e,26oct95,ms   install switch hook in wdbTaskStep if needed (SPR 4920).
  19. 01d,21sep95,ms   fixed SPR 4935 - task BPs work with TEXT_PROTECT now.
  20. 01c,07jun95,ms  no longer use the spare TCB fields
  21. 01b,01jun95,ms  deactivate task BPs when in system mode + some cleanup.
  22. 01a,02nov94,rrr  written.
  23. */
  24. /*
  25. DESCPRIPTION
  26. This library contains breakpoint handling routines when the agent runs
  27. in task mode. Most of those routines are only interfaces for OS specific 
  28. routines (dbgTaskLib.c).
  29. */
  30. /* includes */
  31. #include "vxWorks.h"
  32. #include "regs.h"
  33. #include "stddef.h"
  34. #include "intLib.h"
  35. #include "wdb/wdb.h"
  36. #include "wdb/dll.h"
  37. #include "wdb/wdbRegs.h"
  38. #include "wdb/wdbBpLib.h"
  39. #include "wdb/wdbLibP.h"
  40. #include "wdb/wdbLib.h"
  41. #include "wdb/wdbRtIfLib.h"
  42. #include "wdb/wdbSvcLib.h"
  43. #include "wdb/wdbEvtLib.h"
  44. #include "wdb/wdbDbgLib.h"
  45. /* defines */
  46. #define WDB_INFO(p) (&(((WIND_TCB *)(p))->wdbInfo))
  47. #if     CPU_FAMILY==MC680X0
  48. #undef reg_pc
  49. #define reg_pc  regSet.pc
  50. #undef reg_sp
  51. #define reg_sp  regSet.addrReg[7]
  52. #undef reg_fp
  53. #define reg_fp  regSet.addrReg[6]
  54. #endif  /* CPU_FAMILY==MC680X0 */
  55. /* externals */
  56. IMPORT FUNCPTR _func_dbgHostNotify;
  57. /* locals */
  58. static WDB_EVT_NODE bpEventNode;
  59. static dll_t bpEventList;
  60. /* forward static declarations */
  61. static void  wdbTaskBpPost (UINT32 contextId, WDB_IU_REGS * pRegisters, 
  62. UINT32 addr);
  63. static void wdbBreakpointEventGet (void * pTcb, WDB_EVT_DATA * pEvtData);
  64. static void wdbBreakpointEventDeq (void * arg);
  65. static UINT32 wdbTaskBpAdd (WDB_EVTPT_ADD_DESC * pEv);
  66. /*******************************************************************************
  67. *
  68. * wdbTaskBpLibInit - Initialize the task break point library
  69. *
  70. * NOMANUAL
  71. *
  72. * RETURNS : N/A
  73. */
  74. void wdbTaskBpLibInit (void)
  75.     {
  76.     _wdbTaskBpAdd     = wdbTaskBpAdd;
  77.     _wdbTaskStep     = (UINT32 (*)()) dbgTaskStep;
  78.     _wdbTaskCont     = (UINT32 (*)()) dbgTaskCont;
  79. #if DBG_NO_SINGLE_STEP
  80.     _wdbTaskBpTrap     = (VOIDFUNCPTR) dbgTaskBpTrap;
  81. #else /* DBG_NO_SINGLE_STEP */
  82.     _wdbTaskBpTrace     = (VOIDFUNCPTR) dbgTaskBpTrace;
  83.     _wdbTaskBpBreakpoint    = (VOIDFUNCPTR) dbgTaskBpBreakpoint;
  84. #endif /* DBG_NO_SINGLE_STEP */
  85.     _func_dbgHostNotify     = (FUNCPTR) wdbTaskBpPost;
  86.   
  87.     /* initialize breakpoint event list */
  88.     dll_init (&bpEventList);
  89.     wdbEventNodeInit (&bpEventNode, wdbBreakpointEventGet,
  90.     wdbBreakpointEventDeq, (void *) &bpEventNode);
  91.     }
  92. /******************************************************************************
  93. *
  94. * wdbTaskBpPost - post a breakpoint event to the host
  95. * This routine posts an event to the host when a task mode breakpoint
  96. * is hit. It is called when the system is suspended.
  97. * RETURNS : N/A
  98. *
  99. * NOMANUAL
  100. */ 
  101. static void wdbTaskBpPost
  102.     (
  103.     UINT32 contextId, /* task ID */
  104.     WDB_IU_REGS * pRegisters, /* task registers */
  105.     UINT32 addr /* breakpoint addr */
  106.     )
  107.     {
  108.     int level;
  109.     dll_t * pEvtList; /* pointer on event list */ 
  110.     level = intLock ();
  111.     WDB_INFO(contextId)->taskPc = (UINT32) pRegisters->reg_pc;
  112.     WDB_INFO(contextId)->taskFp = (UINT32) pRegisters->reg_fp; 
  113.     WDB_INFO(contextId)->taskSp = (UINT32) pRegisters->reg_sp; 
  114.     WDB_INFO(contextId)->taskBpAddr = addr;
  115.     /* 
  116.      * If the task is already queued in the event list, only overwrite 
  117.      * breakpoint informations for this task. 
  118.      * Otherwise add this breakpoint in the event list and post the event
  119.      * to the host.
  120.      * If the action associated with a specific breakpoint does not include
  121.      * ACTION_STOP, it is possible that we send several breakpoint events
  122.      * for the same task before the target server reads those events. In 
  123.      * that case, we can loose some breakpoint events.
  124.      */
  125.     if (!(WDB_INFO(contextId)->wdbState & WDB_QUEUED))
  126. {
  127. pEvtList = (dll_t *)&WDB_INFO(contextId)->wdbEvtList;
  128. WDB_INFO(contextId)->wdbState |= WDB_QUEUED;
  129. dll_insert(pEvtList, &bpEventList);
  130. wdbEventPost (&bpEventNode);
  131. }
  132.     intUnlock (level);
  133.     }
  134. /******************************************************************************
  135. *
  136. * wdbBreakpointEventGet - fill in the WDB_EVT_DATA for the host.
  137. *
  138. * Earlier, we posted an WDB_EVT_NODE to the event library.
  139. * The event library is now calling this routine (bpEventNode->getEvent)
  140. * in order to get the eventMsg associated with this bpEventNode.
  141. *
  142. * RETURNS : N/A
  143. *
  144. * NOMANUAL
  145. */
  146. static void wdbBreakpointEventGet
  147.     (
  148.     void * pNode,
  149.     WDB_EVT_DATA * pEvtData
  150.     )
  151.     {
  152.     WDB_BP_INFO *  pBpInfo = (WDB_BP_INFO *)&pEvtData->eventInfo;
  153.     int  level;
  154.     WIND_TCB * pTcb;
  155.     level = intLock ();
  156.     if (dll_empty (&bpEventList))
  157. {
  158. intUnlock (level);
  159. pEvtData->evtType = WDB_EVT_NONE;
  160. return;
  161. }
  162.     /*
  163.      * The return value of dll_tail is the address of WDB breakpoint
  164.      * Event data structure in WDB_INFO. WDB_INFO is located above WIND_TCB
  165.      * in the tasks memory partition. You can therefore calculate the
  166.      * pTcb by subtracting the offset of wdbEvtList in WDB_INFO and the
  167.      * size of the WIND_TCB structure from the return value of dll_tail.
  168.      */
  169.     pTcb = ((WIND_TCB *)((char *)(dll_tail (&bpEventList)) -
  170.  OFFSET (WIND_TCB, wdbInfo.wdbEvtList)));
  171.     dll_remove ((dll_t *)&(WDB_INFO(pTcb)->wdbEvtList));
  172.     /* 
  173.      * If the program counter of the task is not the same that the address
  174.      * of the breakpoint we have encountered, it must be a watch point 
  175.      */
  176.     if (WDB_INFO(pTcb)->taskPc != WDB_INFO(pTcb)->taskBpAddr)
  177. {
  178. /* assume it is a watch point */
  179. pEvtData->evtType = WDB_EVT_WP;
  180. pBpInfo->numInts = 6;
  181. pBpInfo->addr = WDB_INFO(pTcb)->taskBpAddr;
  182. }
  183.     else
  184. {
  185. /* assume it is a break point */
  186. pEvtData->evtType = WDB_EVT_BP;
  187. pBpInfo->numInts = 5;
  188. }
  189.     pBpInfo->context.contextType = WDB_CTX_TASK;
  190.     pBpInfo->context.contextId = (int) pTcb;
  191.     pBpInfo->pc = WDB_INFO(pTcb)->taskPc;
  192.     pBpInfo->fp = WDB_INFO(pTcb)->taskFp;
  193.     pBpInfo->sp = WDB_INFO(pTcb)->taskSp;
  194.     WDB_INFO(pTcb)->wdbState &= ~WDB_QUEUED;
  195.     intUnlock (level);
  196.     }
  197. /******************************************************************************
  198. *
  199. * wdbBreakpointEventDeq - dequeue an event node.
  200. *
  201. * The host has acknowledged the receipt of our eventMsg, so the event
  202. * library is now calling this routine to dequeue the bpEventNode.
  203. *
  204. * RETURNS : N/A
  205. *
  206. * NOMANUAL
  207. */
  208. static void wdbBreakpointEventDeq
  209.     (
  210.     void * pBreakpointNode
  211.     )
  212.     {
  213.     if (!dll_empty(&bpEventList))
  214. wdbEventPost (&bpEventNode);
  215.     }
  216. /******************************************************************************
  217. *
  218. * wdbTaskBpAdd - initialize tasking breakpoints
  219. *
  220. * This routine initializes tasking breakpoint when the first 
  221. * breakpoint is added.
  222. *
  223. * RETURNS : OK always
  224. *
  225. * NOMANUAL
  226. */
  227. static UINT32 wdbTaskBpAdd
  228.     (
  229.     WDB_EVTPT_ADD_DESC * pEv
  230.     )
  231.     {
  232.     dbgTaskBpHooksInstall();
  233.     return (WDB_OK);
  234.     }