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

VxWorks

开发平台:

C/C++

  1. /* wdbCtxLib.c - WDB context control routines */
  2. /* Copyright 1994-1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,24mar98,dbt  added WDB_CTX_STATUS_GET service.
  7. 01d,02oct96,elp  added casts due to TGT_ADDR_T type change in wdb.h.
  8. 01c,22sep95,ms   don't allow agent to WDB_SUSPEND itself (id=0). SPR #4979.
  9. 01b,19jun95,ms   the untested "system context" creation is no longer supported.
  10. 01a,30sep94,ms   written.
  11. */
  12. /*
  13. DESCPRIPTION
  14. Control other contexts from the agent.
  15. */
  16. #include "wdb/wdb.h"
  17. #include "wdb/wdbLibP.h"
  18. #include "wdb/wdbSvcLib.h"
  19. #include "wdb/wdbRtIfLib.h"
  20. #include "wdb/wdbArchIfLib.h"
  21. /* hacks */
  22. extern BOOL      wdbOneShot;
  23. /* forward declarations */
  24. static UINT32 wdbCtxKill (WDB_CTX * pCtx);
  25. static UINT32 wdbCtxSuspend (WDB_CTX * pCtx);
  26. static UINT32 wdbCtxStatusGet (WDB_CTX * pCtx, UINT32 * pCtxStatus);
  27. /******************************************************************************
  28. *
  29. * wdbCtxLibInit -
  30. */
  31. void wdbCtxLibInit (void)
  32.     {
  33.     wdbSvcAdd (WDB_CONTEXT_CREATE, wdbCtxCreate, xdr_WDB_CTX_CREATE_DESC,
  34. xdr_UINT32);
  35.     wdbSvcAdd (WDB_CONTEXT_KILL, wdbCtxKill, xdr_WDB_CTX, xdr_void);
  36.     wdbSvcAdd (WDB_CONTEXT_SUSPEND, wdbCtxSuspend, xdr_WDB_CTX, xdr_void);
  37.     wdbSvcAdd (WDB_CONTEXT_RESUME, wdbCtxResume, xdr_WDB_CTX, xdr_void);
  38.     wdbSvcAdd (WDB_CONTEXT_STATUS_GET, wdbCtxStatusGet, xdr_WDB_CTX,
  39. xdr_UINT32);
  40.     }
  41. /******************************************************************************
  42. *
  43. * wdbCtxCreate - create a context.
  44. */
  45. UINT32 wdbCtxCreate
  46.     (
  47.     WDB_CTX_CREATE_DESC * pCtxCreate,
  48.     UINT32 * pTid
  49.     )
  50.     {
  51.     /* task mode context creation */
  52.     if (wdbIsNowTasking())
  53. {
  54. if (pWdbRtIf->taskCreate == NULL)
  55.     return (WDB_ERR_NO_RT_PROC);
  56.         *pTid = (*pWdbRtIf->taskCreate)
  57. (pCtxCreate->name, pCtxCreate->priority,
  58. pCtxCreate->options, (char *)pCtxCreate->stackBase,
  59. pCtxCreate->stackSize, (char *)pCtxCreate->entry,
  60. pCtxCreate->args, pCtxCreate->redirIn,
  61. pCtxCreate->redirOut, pCtxCreate->redirErr);
  62. if (*pTid == ERROR)
  63.     return (WDB_ERR_RT_ERROR);
  64. return (OK);
  65. }
  66.     /* external mode context creation */
  67.     return (WDB_ERR_NO_AGENT_PROC);
  68.     }
  69. /******************************************************************************
  70. *
  71. * wdbCtxKill - kill a context.
  72. *
  73. * killing the "WDB_CTX_SYSTEM" context causes a reboot.
  74. * Only the tasking agent can kill a task context.
  75. */
  76. static UINT32 wdbCtxKill
  77.     (
  78.     WDB_CTX *  pCtx /* context to kill */
  79.     )
  80.     {
  81.     /* killing the WDB_CTX_SYSTEM means reboot */
  82.     if (pCtx->contextType == WDB_CTX_SYSTEM)
  83. (*pWdbRtIf->reboot)();
  84.     /* killing any other context is only valid in tasking mode */
  85.     if (wdbIsNowExternal())
  86. return (WDB_ERR_AGENT_MODE);
  87.     /* else we are a tasking agent and must kill another task */
  88.     if (pWdbRtIf->taskDelete == NULL)
  89.         return (WDB_ERR_NO_RT_PROC);
  90.     return (((*pWdbRtIf->taskDelete) (pCtx) == OK ?
  91.  OK : WDB_ERR_INVALID_CONTEXT));
  92.     }
  93. /******************************************************************************
  94. *
  95. * wdbCtxSuspend - suspend a context.
  96. *
  97. * Task agent:   makes an OS callout to suspend a context (WDB_CTX).
  98. * Extern agent: ignores WDB_CTX. Suspends the system.
  99. */
  100. static UINT32 wdbCtxSuspend
  101.     (
  102.     WDB_CTX *  pCtx /* context to suspend */
  103.     )
  104.     {
  105.     /* task mode agent's context suspend routine */
  106.     if (wdbIsNowTasking ())
  107. {
  108. if (pWdbRtIf->taskSuspend == NULL)
  109.     return (WDB_ERR_NO_RT_PROC);
  110. if (pCtx->contextId == 0)
  111.     return (WDB_ERR_INVALID_CONTEXT);
  112. return (((*pWdbRtIf->taskSuspend) (pCtx) == OK ?
  113. OK : WDB_ERR_INVALID_CONTEXT));
  114. }
  115.     /* external mode agent's context suspend routine */
  116.     if (pCtx->contextType != WDB_CTX_SYSTEM)
  117. return (WDB_ERR_AGENT_MODE);
  118.     wdbOneShot = FALSE;
  119.     return (OK);
  120.     }
  121. /******************************************************************************
  122. *
  123. * wdbCtxResume - resume a context.
  124. *
  125. * Task agent:   makes an OS callout to resume a context (WDB_CTX).
  126. * Extern agent: ignores WDB_CTX. Resumes the system.
  127. */
  128. UINT32 wdbCtxResume
  129.     (
  130.     WDB_CTX *  pCtx /* context to resume */
  131.     )
  132.     {
  133.     /* task mode agent's context resume routine */
  134.     if (wdbIsNowTasking ())
  135.         {
  136.         if (pWdbRtIf->taskResume == NULL)
  137.     return (WDB_ERR_NO_RT_PROC);
  138. return (((*pWdbRtIf->taskResume) (pCtx) == OK ?
  139. OK : WDB_ERR_INVALID_CONTEXT));
  140.         }
  141.     /* external mode agent's context resume routine */
  142.     if (pCtx->contextType != WDB_CTX_SYSTEM)
  143. return (WDB_ERR_AGENT_MODE);
  144.     wdbOneShot = TRUE;
  145.     return (OK);
  146.     }
  147. /******************************************************************************
  148. *
  149. * wdbCtxStatusGet - get the status of a context.
  150. *
  151. * This routine returns the status of a context.
  152. *
  153. */
  154. static UINT32 wdbCtxStatusGet
  155.     (
  156.     WDB_CTX * pCtx, /* context to get status of */
  157.     UINT32 * pCtxStatus /* were to put the context status */
  158.     )
  159.     {
  160.     /* 
  161.      * At that moment we can only get the status of the system context.
  162.      * Support for task should be implemented latter if we need it.
  163.      */
  164.     if (wdbIsNowTasking ())
  165. return (WDB_ERR_AGENT_MODE);
  166.     /* external mode agent's context status get routine */
  167.     if (pCtx->contextType != WDB_CTX_SYSTEM)
  168. return (WDB_ERR_AGENT_MODE);
  169.     if (wdbOneShot) /* the system context is running */
  170. *pCtxStatus = WDB_CTX_RUNNING;
  171.     else /* the system context is suspended */
  172. *pCtxStatus = WDB_CTX_SUSPENDED;
  173.     return (WDB_OK);
  174.     }