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

VxWorks

开发平台:

C/C++

  1. /* wdbLib.c - WDB agent context management library */
  2. /* Copyright 1994-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01r,28feb02,jhw  Add entry point to tWdbTask. (SPR 73238).
  7. 01q,09feb99,fle  doc : put the code examples between .CS and .CE markups
  8. 01p,24nov98,cym  disabling clock during system mode on simnt.
  9. 01o,05oct98,jmp  doc: fixed DESCRIPTION section.
  10. 01n,27aug98,fle  doc : documented undocumented routines headers
  11. 01m,25mar98,dbt  added wdbSystemSuspend() routine.
  12. 01l,17dec97,dbt  Set driver in interrupt mode in wdbResumeSystem() routine only
  13.                  if wdb agent can run in task mode (SPR #5630).
  14. 01k,02oct96,elp  added casts due to TGT_ADDR_T type change in wdb.h.
  15. 01j,09jul96,ms   wdbModeSet to task mode automatically resumes the system.
  16. 01i,03jun96,kkk  replace _sigCtxLoad() with WDB_CTX_LOAD() and _sigCtxSave()
  17.                  with WDB_CTX_SAVE().
  18. 01h,29aug95,ms   fixed SPRs #4785 and 4499 for external mode agent I/O
  19. 01g,21jun95,ms  added global variable wdbTaskId.
  20. 01f,15jun95,ms  use intRegsLock instead of _sigCtxIntLock
  21. 01e,03jun95,ms  don't notify host if not connected.
  22. 01d,25may95,ms  added fpp reg support for system mode agent.
  23. 01c,07feb95,ms  pass RPC transport handles and commIf's to both agents.
  24. 01b,18jan94,rrr  made wdbExternSystemResg global.
  25. 01a,06oct94,ms   written.
  26. */
  27. /*
  28. DESCRIPTION
  29. This library provides a routine to transfer control from the run time 
  30. system to the WDB agent running in external mode. This agent in external
  31. mode allows a system-wide control, including ISR debugging, from a host tool
  32. (eg: Crosswind, WindSh ...) through the target server and the WDB
  33. communcation link.
  34. INTERNAL
  35. This library contains all the routines that manipulate
  36. the WDB agents context, including the agents main command loop.
  37. INCLUDE FILES: wdb/wdbLib.h
  38. SEE ALSO:
  39. .I "API Guide: WTX Protocol",
  40. .tG "Overview"
  41. */
  42. #include "wdb/wdb.h"
  43. #include "wdb/wdbLib.h"
  44. #include "wdb/wdbLibP.h"
  45. #include "wdb/wdbRpcLib.h"
  46. #include "wdb/wdbSvcLib.h"
  47. #include "wdb/wdbCommIfLib.h"
  48. #include "wdb/wdbRpcLib.h"
  49. #include "wdb/wdbRtIfLib.h"
  50. #include "wdb/wdbArchIfLib.h"
  51. #include "wdb/wdbEvtLib.h"
  52. #include "string.h"
  53. /* Agent variables */
  54. WDB_RT_IF *     pWdbRtIf; /* interface to runtime system */
  55. static u_int wdbState; /* WDB_STATE_EXTERN_RUNNING? */
  56. static u_int wdbMode; /* current agent mode. For version 1,
  57.  * only one agent active at a time. */
  58. static u_int wdbAvailModes; /* available agent modes */
  59. static struct timeval wdbTv = {3, 0}; /* 3 second timeout on host NOTIFY */
  60. /* task agent variables */
  61. static WDB_COMM_IF * pWdbTaskCommIf; /* communication interface */
  62. static void * pWdbTaskXport; /* RPC transport handle */
  63. int wdbTaskId; /* agents task ID */
  64. /* system agent variables */
  65. static WDB_IU_REGS wdbExternAgentRegs;
  66. WDB_IU_REGS wdbExternSystemRegs;
  67. static void (*wdbSuspendCallbackRtn)(); /* callback routine */
  68. static int wdbSuspendCallbackArg; /* callback argument */
  69. BOOL wdbOneShot = FALSE; /* resume system after cmd */
  70. static WDB_COMM_IF * pWdbExternCommIf; /* communication interface */
  71. static void * pWdbExternXport; /* RPC transport handle */
  72. static dll_t wdbRegSetList; /* register set list */
  73. /* forward declarations */
  74. static void   wdbCmdLoop (void);
  75. static void   wdbCmdOnce (void);
  76. /******************************************************************************
  77. *
  78. * wdbInstallRtIf - install the runtime interface functions.
  79. *
  80. * The WDB agent is independent of the underlying runtime system or OS.
  81. * This routine installs OS callouts for the agent to use.
  82. *
  83. * NOMANUAL
  84. */
  85. void wdbInstallRtIf
  86.     (
  87.     WDB_RT_IF * pRtIf /* Must be a static structure */
  88.     )
  89.     {
  90.     pWdbRtIf   = pRtIf;
  91.     }
  92. /******************************************************************************
  93. *
  94. * wdbInstallCommIf - install the communication interface.
  95. *
  96. * NOMANUAL
  97. */ 
  98. void wdbInstallCommIf
  99.     (
  100.     WDB_COMM_IF * pCommIf, /* communication functions */
  101.     WDB_XPORT * pXport /* RPC xport handle */
  102.     )
  103.     {
  104.     pWdbTaskCommIf = pCommIf;
  105.     pWdbTaskXport = pXport;
  106.     pWdbExternCommIf = pCommIf;
  107.     pWdbExternXport = pXport;
  108.     }
  109. /******************************************************************************
  110. *
  111. * wdbInfoGet - get info on the WDB agent.
  112. *
  113. * NOMANUAL
  114. */
  115. void wdbInfoGet
  116.     (
  117.     WDB_AGENT_INFO * pInfo
  118.     )
  119.     {
  120.     pInfo->agentVersion = WDB_VERSION_STR;
  121.     pInfo->mtu = wdbCommMtu;
  122.     pInfo->mode = wdbAvailModes;
  123.     }
  124. /******************************************************************************
  125. *
  126. * wdbTask - WDB task entry point
  127. *
  128. * This is the WDB task entry point. It simply calls wdbCmdLoop() but it has
  129. * been added to have a "real" entry point to WDB task when one issues
  130. * a i() command.
  131. *
  132. * NOMANUAL
  133. */
  134. void wdbTask (void)
  135.     {
  136.     wdbCmdLoop ();
  137.     }
  138.      
  139. /******************************************************************************
  140. *
  141. * wdbTaskInit - initialize the task mode agent.
  142. *
  143. * This routine creates a task debug agent by making callouts to
  144. * the runtime system. If the runtime system supports task creation,
  145. * then this routine should succeed.
  146. *
  147. * RETURNS: OK, or ERROR if unable to create the task agent.
  148. *
  149. * NOMANUAL
  150. */
  151. STATUS wdbTaskInit
  152.     (
  153.     int           wdbTaskPriority, /* agent task priority */
  154.     int           wdbTaskOptions, /* agent task options */
  155.     caddr_t       wdbTaskStackBase, /* agent task stack base (or NULL) */
  156.     int           wdbTaskStackSize /* agent task stack size */
  157.     )
  158.     {
  159.     WDB_CTX context;
  160.     int args[10];
  161.     /* create the agent's task context via callouts to the OS */
  162.     if ((pWdbRtIf->taskCreate == NULL) ||
  163. (pWdbRtIf->taskResume == NULL) ||
  164. (pWdbTaskXport == NULL))
  165. return (ERROR);
  166.     context.contextId = (*pWdbRtIf->taskCreate) ("tWdbTask", wdbTaskPriority,
  167. wdbTaskOptions, NULL, wdbTaskStackSize, (char *)wdbTask,
  168. args, 0, 0, 0);
  169.     if (context.contextId == ERROR)
  170. return (ERROR);
  171.     context.contextType = WDB_CTX_TASK;
  172.     if ((*pWdbRtIf->taskResume)(&context) == ERROR)
  173. return (ERROR);
  174.     /* record the fact that the agent can run as a task */
  175.     wdbAvailModes |= WDB_MODE_TASK;
  176.     /* store away the task ID in a global variable for all to see */
  177.     wdbTaskId = context.contextId;
  178.     return (OK);
  179.     }
  180. /******************************************************************************
  181. *
  182. * wdbExternInit - initialize the external mode agent.
  183. *
  184. * This routine sets up the external agents context (stack pointer and
  185. * entry address). It does not start the external agents command loop.
  186. *
  187. * RETURNS: OK always.
  188. *
  189. * NOMANUAL
  190. */
  191. STATUS wdbExternInit
  192.     (
  193.     void *   stackBase /* stack to use */
  194.     )
  195.     {
  196.     /* set up the external agents context */
  197.     int pArgs[10];
  198.     pArgs[0] = 1;
  199.     if (pWdbExternXport == NULL)
  200. return (ERROR);
  201.     _sigCtxSetup (&wdbExternAgentRegs, stackBase, wdbCmdLoop, pArgs);
  202.     intRegsLock (&wdbExternAgentRegs);
  203.     /* initialize the linked list of register objects to save/restore */
  204.     dll_init (&wdbRegSetList);
  205.     /* mark the agent as external */
  206.     wdbAvailModes |= WDB_MODE_EXTERN;
  207.     /* install the external agent's interrupt on first packet hook */
  208.     if ((pWdbExternCommIf->hookAdd != NULL))
  209. (*pWdbExternCommIf->hookAdd) (pWdbExternCommIf->commId, wdbCmdOnce, 0);
  210.     return (OK);
  211.     }
  212. /******************************************************************************
  213. *
  214. * wdbExternRegSetObjAdd - tell the external agent to manipulate a class of regs.
  215. *
  216. * NOMANUAL
  217. */ 
  218. void wdbExternRegSetObjAdd
  219.     (
  220.     WDB_REG_SET_OBJ * pRegSet /* reg class object */
  221.     )
  222.     {
  223.     dll_insert (&pRegSet->node, &wdbRegSetList);
  224.     }
  225. /******************************************************************************
  226. *
  227. * wdbExternRegsSet -
  228. *
  229. * NOMANUAL
  230. */ 
  231. STATUS wdbExternRegsSet
  232.     (
  233.     WDB_REG_SET_TYPE type,
  234.     char * pRegs
  235.     )
  236.     {
  237.     dll_t * pThisNode;
  238.     WDB_REG_SET_OBJ * pRegSet;
  239.     if (type == WDB_REG_SET_IU)
  240. {
  241. bcopy (pRegs, (char *)&wdbExternSystemRegs, sizeof (wdbExternSystemRegs));
  242. return (OK);
  243. }
  244.     for (pThisNode = dll_head (&wdbRegSetList);
  245.  pThisNode != dll_end  (&wdbRegSetList);
  246.  pThisNode  = dll_next (pThisNode))
  247. {
  248. pRegSet = (WDB_REG_SET_OBJ *)pThisNode;
  249. if (pRegSet->regSetType == type)
  250.     {
  251.     (*pRegSet->set) (pRegs);
  252.     return (OK);
  253.     }
  254. }
  255.     return (ERROR);
  256.     }
  257. /******************************************************************************
  258. *
  259. * wdbExternRegsGet - gets external registers
  260. *
  261. * NOMANUAL
  262. */ 
  263. STATUS wdbExternRegsGet
  264.     (
  265.     WDB_REG_SET_TYPE type,
  266.     char ** ppRegs
  267.     )
  268.     {
  269.     dll_t * pThisNode;
  270.     WDB_REG_SET_OBJ * pRegSet;
  271.     if (type == WDB_REG_SET_IU)
  272. {
  273. *ppRegs = (char *)&wdbExternSystemRegs;
  274. return (OK);
  275. }
  276.     for (pThisNode  = dll_head (&wdbRegSetList);
  277.  pThisNode != dll_end  (&wdbRegSetList);
  278.  pThisNode  = dll_next (pThisNode))
  279. {
  280. pRegSet = (WDB_REG_SET_OBJ *)pThisNode;
  281. if (pRegSet->regSetType == type)
  282.     {
  283.     (*pRegSet->get) (ppRegs);
  284.     return (OK);
  285.     }
  286. }
  287.     return (ERROR);
  288.     }
  289. /******************************************************************************
  290. *
  291. * wdbModeSet - set the agent mode.
  292. *
  293. * This routine activates one of the agents and deactivates the other.
  294. *
  295. * RETURNS: OK if the requested mode is supported, else ERROR.
  296. *
  297. * NOMANUAL
  298. */
  299. STATUS wdbModeSet
  300.     (
  301.     int newMode /* agent mode */
  302.     )
  303.     {
  304.     /* check if newMode is OK to set */
  305.     if ((newMode != WDB_MODE_TASK) && (newMode != WDB_MODE_EXTERN))
  306. return (ERROR); /* requested mode is invalid */
  307.     if (! (newMode & wdbAvailModes))
  308. return (ERROR); /* requested mode is not available */
  309.     /*
  310.      * if both agents are available, deactivate the other agent
  311.      * since both agents use the same communication port, all we
  312.      * need to do is add or remove the external agents interrupt hook.
  313.      */
  314.     if (wdbAvailModes == WDB_MODE_BI)
  315. {
  316. if (newMode == WDB_MODE_TASK)
  317.     {
  318.     if ((pWdbExternCommIf->hookAdd != NULL))
  319. (*pWdbExternCommIf->hookAdd) (pWdbExternCommIf->commId,
  320.       NULL, 0);
  321.     if (wdbMode == WDB_MODE_EXTERN)
  322. wdbOneShot = TRUE;
  323.     }
  324. else
  325.     {
  326.     if ((pWdbExternCommIf->hookAdd != NULL))
  327. (*pWdbExternCommIf->hookAdd) (pWdbExternCommIf->commId,
  328.       wdbCmdOnce, 0);
  329.     }
  330. }
  331.     wdbMode = newMode;
  332.     return (OK);
  333.     }
  334. /******************************************************************************
  335. *
  336. * wdbRunsExternal - check if the agent runs externally.
  337. *
  338. * NOMANUAL
  339. */
  340. BOOL  wdbRunsExternal (void)
  341.     {
  342.     return ((wdbAvailModes & WDB_MODE_EXTERN) != 0);
  343.     }
  344. /******************************************************************************
  345. *
  346. * wdbIsNowExternal - Check if the agent is now in external mode.
  347. *
  348. * NOMANUAL
  349. */
  350. BOOL wdbIsNowExternal (void)
  351.     {
  352.     return (wdbMode & WDB_MODE_EXTERN);
  353.     }
  354. /******************************************************************************
  355. *
  356. * wdbRunsTasking - check if the agent runs as a task.
  357. *
  358. * NOMANUAL
  359. */
  360. BOOL  wdbRunsTasking (void)
  361.     {
  362.     return ((wdbAvailModes & WDB_MODE_TASK) != 0);
  363.     }
  364. /******************************************************************************
  365. *
  366. * wdbIsNowTasking - Check if the agent is now in tasking mode.
  367. *
  368. * NOMANUAL
  369. */
  370. BOOL  wdbIsNowTasking (void)
  371.     {
  372.     return (!wdbIsNowExternal());
  373.     }
  374. /******************************************************************************
  375. *
  376. * wdbCmdLoop - agent command loop.
  377. *
  378. * This is the command loop used by both agents.
  379. *
  380. * NOMANUAL
  381. */
  382. static void wdbCmdLoop (void)
  383.     {
  384.     WDB_XPORT * pXport;
  385.     /* get the RPC transport handle */
  386.     if (wdbIsNowExternal())
  387. pXport = pWdbExternXport;
  388.     else
  389. pXport = pWdbTaskXport;
  390.     /* check if the external agent needs to perform a callback */
  391.     if (wdbIsNowExternal() && (wdbSuspendCallbackRtn != NULL))
  392. {
  393. (*wdbSuspendCallbackRtn)(wdbSuspendCallbackArg);
  394. wdbSuspendCallbackRtn = NULL;
  395. }
  396.     /* the main command loop */
  397.     while (1)
  398.         {
  399. /* try to process an RPC command (with timeout) */
  400. if (!wdbRpcRcv (pXport, (wdbEventListIsEmpty() ? NULL : &wdbTv)))
  401.     {
  402.     /* on time out, see if we need to notify the host of events */
  403.     if (!wdbEventListIsEmpty())
  404. wdbRpcNotifyHost(pXport);
  405.     }
  406. if ((wdbState & WDB_STATE_EXTERN_RUNNING) && wdbOneShot && wdbEventListIsEmpty())
  407.     wdbResumeSystem();
  408. }
  409.     }
  410. /******************************************************************************
  411. *
  412. * wdbCmdOnce - Process one external agent command, then return to the system.
  413. *
  414. * This routine is installed as an interrupt on first packet hook to
  415. * notify the external agent.
  416. *
  417. * XXX - should really change the way the hook is done. E.g., examine the
  418. * packet, and if it is for the agent use it, else let the comm layer
  419. * keep it. Right now we assume that any packet must be for the agent,
  420. * and the agent just discards packets that are not really for it.
  421. *
  422. * NOMANUAL
  423. */
  424. static void wdbCmdOnce (void)
  425.     {
  426.     wdbOneShot = TRUE;
  427.     wdbSuspendSystemHere (NULL, 0);
  428.     }
  429. /******************************************************************************
  430. *
  431. * wdbSuspendSystem - suspend the run-time system.
  432. * This routine transfers control from the runtime system to the extern agent.
  433. * The integer-unit context of the run-time sstem is passed to us (which we
  434. * save). We are also passed a callback to execute after the system has been
  435. * suspended.
  436. * This routine is called by the system breakpoint library.
  437. *
  438. * INTERNAL
  439. * Do not confuse with wdbSystemSuspend() routine. This routine is not part
  440. * of the API and should not be called by the user.
  441. *
  442. * NOMANUAL
  443. */
  444. void wdbSuspendSystem
  445.     (
  446.     WDB_IU_REGS * pRegs, /* runtime context to save */
  447.     void   (*callBack)(), /* callback after system is stopped */
  448.     int   arg /* callback argument */
  449.     )
  450.     {
  451.     dll_t * pThisNode;
  452.     WDB_REG_SET_OBJ * pRegSet;
  453.     intLock();
  454.     wdbSuspendCallbackRtn = callBack; /* install the callback */
  455.     wdbSuspendCallbackArg = arg; /* and the callback argument */
  456.     wdbState |= WDB_STATE_EXTERN_RUNNING; /* mark extern agent running */
  457.     wdbExternEnterHook(); /* call extern enter hook */
  458.     (*pWdbExternCommIf->modeSet) /* reset communication stack */
  459. (pWdbExternCommIf->commId,
  460. WDB_COMM_MODE_POLL);
  461.     bcopy ((caddr_t)pRegs, /* save inferior context */
  462.    (caddr_t)&wdbExternSystemRegs,
  463.    sizeof (WDB_IU_REGS));
  464.     for (pThisNode  = dll_head (&wdbRegSetList);
  465.          pThisNode != dll_end  (&wdbRegSetList);
  466.          pThisNode  = dll_next (pThisNode))
  467.         {
  468.         pRegSet = (WDB_REG_SET_OBJ *)pThisNode;
  469. (*pRegSet->save)();
  470. }
  471. #if CPU_FAMILY==MC680X0
  472.     wdbExternAgentRegs.regSet.sr &= 0xefff;
  473.     wdbExternAgentRegs.regSet.sr |= (wdbExternSystemRegs.regSet.sr & 0x1000);
  474. #endif
  475.     WDB_CTX_LOAD (&wdbExternAgentRegs); /* run external agent */
  476.     /*NOTREACHED*/
  477.     }
  478. /******************************************************************************
  479. *
  480. * wdbResumeSystem - resume the runtime system.
  481. *
  482. * This routine transfers control from the external agent back to the runtime
  483. * system.
  484. * This routine is called by the system breakpoint library to continue or step.
  485. *
  486. * NOMANUAL
  487. */
  488. void wdbResumeSystem (void)
  489.     {
  490.     dll_t * pThisNode;
  491.     WDB_REG_SET_OBJ * pRegSet;
  492.     wdbState &= (~WDB_STATE_EXTERN_RUNNING); /* mark extern agent done */
  493.     /* 
  494.      * Set driver in interrupt mode only if task mode is supported by the
  495.      * agent. Otherwise, it is not usefull.
  496.      */
  497.     if (wdbRunsTasking ())
  498. {
  499. (*pWdbExternCommIf->modeSet) /* reset communication stack */
  500.                 (pWdbExternCommIf->commId,
  501.     WDB_COMM_MODE_INT);
  502. }
  503.     wdbOneShot = FALSE; /* ... */
  504.     wdbExternExitHook(); /* call extern exit hook */
  505.     /* restore inferior context */
  506.     for (pThisNode  = dll_head (&wdbRegSetList);
  507.          pThisNode != dll_end  (&wdbRegSetList);
  508.          pThisNode  = dll_next (pThisNode))
  509.         {
  510.         pRegSet = (WDB_REG_SET_OBJ *)pThisNode;
  511. (*pRegSet->load)();
  512. }
  513.     WDB_CTX_LOAD (&wdbExternSystemRegs);
  514.     /*NOTREACHED*/
  515.     }
  516. /******************************************************************************
  517. *
  518. * wdbNotifyCallback - callback to notify host of target events
  519. *
  520. * NOMANUAL
  521. */ 
  522. static void wdbNotifyCallback (void)
  523.     {
  524.     wdbRpcNotifyHost (pWdbExternXport);
  525.     wdbResumeSystem();
  526.     }
  527. /******************************************************************************
  528. *
  529. * wdbNotifyHost - notify the host that an event has occured on the target.
  530. *
  531. * This routine is not called directly by anyone. It is called indirectly
  532. * by wdbEventPost().
  533. *
  534. * NOMANUAL
  535. */
  536. void wdbNotifyHost (void)
  537.     {
  538.     /* don't notify the host if we are not connected */
  539.     if (!wdbTargetIsConnected())
  540. return;
  541.     /* if the task agent is currently active, let it do the notify */
  542.     if (wdbIsNowTasking())
  543. {
  544. (*pWdbTaskCommIf->cancel)(pWdbTaskCommIf->commId);
  545. }
  546.     /* if the external agent is running right now, do the notify now */
  547.     else if (wdbState & WDB_STATE_EXTERN_RUNNING)
  548. {
  549. wdbRpcNotifyHost(pWdbExternXport);
  550. }
  551.     /*
  552.      * else the external agent is active, but not currently running.
  553.      * In this case, we suspend the system and have the external agent
  554.      * do the notify as a callback.
  555.      */
  556.      else
  557. {
  558. wdbSuspendSystemHere (wdbNotifyCallback, 0);
  559. }
  560.     }
  561. /******************************************************************************
  562. *
  563. * wdbSuspendSystemHere - suspend the system.
  564. *
  565. * This routine transfers control from the run time system to the external
  566. * agent. This routine is just like wdbSuspendSystem, except we don't pass
  567. * it a register set to save (it uses setjmp to get the register set).
  568. *
  569. * NOMANUAL
  570. */
  571. void wdbSuspendSystemHere
  572.     (
  573.     void  (*callback)(),
  574.     int   arg
  575.     )
  576.     {
  577.     u_int lockKey;
  578.     WDB_IU_REGS regSet;
  579.     lockKey = intLock();
  580. #if CPU==SIMNT
  581.     sysClkDisable();
  582. #endif
  583.     if (WDB_CTX_SAVE (&regSet) == 0)
  584.         {
  585.         _sigCtxRtnValSet (&regSet, 1);
  586.         wdbSuspendSystem (&regSet, callback, arg);
  587.         }
  588. #if CPU==SIMNT
  589.     sysClkEnable();
  590. #endif
  591.     intUnlock (lockKey);
  592.     }
  593. /******************************************************************************
  594. *
  595. * wdbSystemSuspend - suspend the system.
  596. *
  597. * This routine transfers control from the run time system to the WDB 
  598. * agent running in external mode. In order to give back the control to
  599. * the system it must be resumed by the the external WDB agent.
  600. *
  601. * EXAMPLE
  602. *
  603. * The code below, called in a vxWorks application, suspends the system :
  604. * .CS
  605. *   if (wdbSystemSuspend != OK)
  606. *       printf ("External mode is not supported by the WDB agent.n");
  607. * .CE
  608. *
  609. * From a host tool, we can detect that the system is suspended.
  610. *
  611. * First, attach to the target server :
  612. *
  613. * .CS
  614. *   wtxtcl> wtxToolAttach EP960CX
  615. *   EP960CX_ps@sevre
  616. * .CE
  617. *
  618. *Then, you can get the agent mode :
  619. *
  620. * .CS
  621. *   wtxtcl> wtxAgentModeGet
  622. *   AGENT_MODE_EXTERN
  623. * .CE
  624. *
  625. * To get the status of the system context, execute :
  626. *
  627. * .CS
  628. *   wtxtcl> wtxContextStatusGet CONTEXT_SYSTEM 0
  629. *   CONTEXT_SUSPENDED
  630. * .CE
  631. *
  632. * In order to resume the system, simply execute :
  633. *
  634. * .CS
  635. *   wtxtcl>  wtxContextResume CONTEXT_SYSTEM 0
  636. *   0
  637. * .CE
  638. *
  639. * You will see that the system is now running :
  640. *
  641. * .CS
  642. *   wtxtcl> wtxContextStatusGet CONTEXT_SYSTEM 0
  643. *   CONTEXT_RUNNING
  644. * .CE
  645. *
  646. * INTERNAL
  647. * This routine is only a user interface for wdbSuspendSystemHere() routine.
  648. * Its name is derived from wdbSuspendSystem but has been modified to
  649. * handle vxWorks API specifications.
  650. *
  651. * RETURNS:
  652. * OK upon successful completion, ERROR if external mode is not supported
  653. * by the WDB agent.
  654. */
  655. STATUS wdbSystemSuspend (void)
  656.     {
  657.     if (wdbIsNowTasking ()) /* set the agent mode if necessary */
  658. {
  659. if (wdbModeSet (WDB_MODE_EXTERN) != OK)
  660.     return (ERROR);
  661. }
  662.     wdbSuspendSystemHere (NULL, 0); /* suspend the system */
  663.     return (OK);
  664.     }