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

VxWorks

开发平台:

C/C++

  1. /* wdbCallLib.c - Call a function on the target */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,04sep98,cdp enable Thumb support for all ARM CPUs with ARM_THUMB==TRUE.
  7. 01e,11jul97,cdp added ARM7TDMI_T support (func call in Thumb state).
  8. 01d,02oct96,elp added casts due to TGT_ADDR_T type change.
  9. 01c,31aug95,ms  WDB_FUNC_CALL now allows file redirection (SPR #4497)
  10. 01b,19jun95,ms removed dependancy on wdbCtxLib
  11. 01a,02nov94,ms  written.
  12. */
  13. /*
  14. DESCPRIPTION
  15. This library contains the RPC to call a function on the target.
  16. The return value of the function is passed to the host asynchronously.
  17. */
  18. #include "wdb/wdb.h"
  19. #include "wdb/wdbLibP.h"
  20. #include "wdb/wdbSvcLib.h"
  21. #include "wdb/wdbRtIfLib.h"
  22. #include "wdb/wdbEvtLib.h"
  23. #include "errno.h"
  24. #include "string.h"
  25. /* data types */
  26. typedef struct
  27.     {
  28.     WDB_EVT_NODE eventNode;
  29.     WDB_CALL_RET_INFO callRetInfo;
  30.     int (*entry)();
  31.     int arg[10];
  32.     WDB_CALL_RET_TYPE returnType;
  33.     } WDB_CALL_RET_NODE;
  34. /* forward declarations */
  35. static UINT32 wdbFuncCall (WDB_CTX_CREATE_DESC *pCtxCreate, UINT32 *pTid);
  36. /******************************************************************************
  37. *
  38. * wdbFuncCallLibInit -
  39. */
  40. void wdbFuncCallLibInit (void)
  41.     {
  42.     wdbSvcAdd (WDB_FUNC_CALL, wdbFuncCall, xdr_WDB_CTX_CREATE_DESC, xdr_UINT32);
  43.     }
  44. /******************************************************************************
  45. *
  46. * callRetEvtDeq - dequeue a function call event node.
  47. */ 
  48. static void callRetEvtDeq
  49.     (
  50.     void *      pExitNode
  51.     )
  52.     {
  53.     (*pWdbRtIf->free) (pExitNode);
  54.     }
  55. /******************************************************************************
  56. *
  57. * callRetEvtGet - get a call return event.
  58. */ 
  59. static void callRetEvtGet
  60.     (
  61.     void *              pNode,
  62.     WDB_EVT_DATA *      pEvtData
  63.     )
  64.     {
  65.     WDB_CALL_RET_NODE *  pCallRetNode = pNode;
  66.     pEvtData->evtType                   = WDB_EVT_CALL_RET;
  67.     pEvtData->eventInfo.callRetInfo = pCallRetNode->callRetInfo;
  68.     }
  69. /******************************************************************************
  70. *
  71. * funcCallWrapper - wrapper for a function call.
  72. */ 
  73. static void funcCallWrapper
  74.     (
  75.     WDB_CALL_RET_NODE * pReturnNode
  76.     )
  77.     {
  78.     if (pReturnNode->callRetInfo.returnType == WDB_CALL_RET_DBL)
  79. {
  80. pReturnNode->callRetInfo.returnVal.returnValDbl =
  81. (*(double (*)())pReturnNode->entry)
  82. (pReturnNode->arg[0],
  83.  pReturnNode->arg[1], pReturnNode->arg[2],
  84.  pReturnNode->arg[3], pReturnNode->arg[4],
  85.  pReturnNode->arg[5], pReturnNode->arg[6],
  86.  pReturnNode->arg[7], pReturnNode->arg[8],
  87.  pReturnNode->arg[9]);
  88. }
  89.     else
  90. {
  91. pReturnNode->callRetInfo.returnVal.returnValInt =
  92. (*pReturnNode->entry) (pReturnNode->arg[0],
  93.  pReturnNode->arg[1], pReturnNode->arg[2],
  94.  pReturnNode->arg[3], pReturnNode->arg[4],
  95.  pReturnNode->arg[5], pReturnNode->arg[6],
  96.  pReturnNode->arg[7], pReturnNode->arg[8],
  97.  pReturnNode->arg[9]);
  98. }
  99.     pReturnNode->callRetInfo.errnoVal = errno;
  100.     wdbEventNodeInit (&pReturnNode->eventNode, callRetEvtGet,
  101.                         callRetEvtDeq, pReturnNode);
  102.     wdbEventPost (&pReturnNode->eventNode);
  103.     }
  104. /******************************************************************************
  105. *
  106. * wdbFuncCall - spawn a task execute a routine, then send back the reply.
  107. */ 
  108. static UINT32 wdbFuncCall
  109.     (
  110.     WDB_CTX_CREATE_DESC * pCtxCreate,
  111.     UINT32 * pTid
  112.     )
  113.     {
  114.     WDB_CTX context;
  115.     WDB_CALL_RET_NODE * pReturnNode;
  116.     if (!wdbIsNowTasking())
  117. return (WDB_ERR_AGENT_MODE);
  118.     if ((pWdbRtIf->taskCreate == NULL) ||
  119. (pWdbRtIf->malloc == NULL) ||
  120. (pWdbRtIf->free == NULL))
  121. return (WDB_ERR_NO_RT_PROC);
  122.     pReturnNode = (WDB_CALL_RET_NODE *)(*pWdbRtIf->malloc)
  123. (sizeof(WDB_CALL_RET_NODE));
  124.     if (pReturnNode == NULL)
  125. return (WDB_ERR_RT_ERROR);
  126. #if ((CPU_FAMILY == ARM) && ARM_THUMB)
  127.     pReturnNode->entry = (int (*)())(pCtxCreate->entry | 1);
  128. #else /* CPU_FAMILY == ARM */
  129.     pReturnNode->entry = (int (*)())pCtxCreate->entry;
  130. #endif /* CPU_FAMILY == ARM */
  131.     bcopy ((char *)pCtxCreate->args, (char *)pReturnNode->arg,
  132. 10 * sizeof (int));
  133.     pReturnNode->callRetInfo.returnType =
  134. (pCtxCreate->options & WDB_FP_RETURN ? WDB_CALL_RET_DBL :
  135.    WDB_CALL_RET_INT);
  136.     pCtxCreate->args[0] = (int)pReturnNode;
  137.     *pTid = (*pWdbRtIf->taskCreate)
  138.                 (pCtxCreate->name, pCtxCreate->priority,
  139.                 pCtxCreate->options, (char *)pCtxCreate->stackBase,
  140.                 pCtxCreate->stackSize, (char *)funcCallWrapper,
  141. pCtxCreate->args, pCtxCreate->redirIn,
  142.                 pCtxCreate->redirOut, pCtxCreate->redirErr);
  143.     if (*pTid == ERROR)
  144. return (WDB_ERR_RT_ERROR);
  145.     pReturnNode->callRetInfo.callId = *pTid;
  146.     context.contextId = *pTid;
  147.     context.contextType = WDB_CTX_TASK;
  148.     return (((*pWdbRtIf->taskResume) (&context) == OK ?
  149. OK : WDB_ERR_RT_ERROR));
  150.     }