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

VxWorks

开发平台:

C/C++

  1.     return (WTX_EVTPT_LIST_2 *) &pOut->nEvtpt;
  2.     }
  3. /*******************************************************************************
  4. *
  5. * wtxFileClose - close a file on the target server
  6. *
  7. * This routine closes the file previously opened in a call of
  8. * wtxFileOpen() and cancels any VIO redirection caused by that open.
  9. *
  10. * RETURNS: WTX_OK or WTX_ERROR.
  11. *
  12. * SEE ALSO: WTX_CLOSE, wtxFileOpen() 
  13. */
  14. STATUS wtxFileClose 
  15.     (
  16.     HWTX hWtx, /* WTX API handle */
  17.     INT32 fileDescriptor /* file to close descriptor */
  18.     )
  19.     {
  20.     WTX_MSG_RESULT out;
  21.     WTX_MSG_PARAM in;
  22.     WTX_ERROR_T callStat;
  23.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  24.     memset (&out, 0, sizeof (out));
  25.     memset (&in, 0, sizeof (in));
  26.    
  27.     in.param.valueType = V_INT32;
  28.     in.param.value_u.v_int32 = fileDescriptor;
  29.     callStat = exchange (hWtx, WTX_CLOSE, &in, &out);
  30.     if (callStat != WTX_ERR_NONE)
  31. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  32.     wtxExchangeFree (hWtx->server, WTX_CLOSE, &out);
  33.     return (WTX_OK);
  34.     }
  35. /*******************************************************************************
  36. *
  37. * wtxFileOpen - open a file on the target server
  38. *
  39. * This routine requests that the target server open a file in the host
  40. * environment and optionally redirects I/O from a VIO channel to it. The
  41. * user may select which VIO channel is redirected to and from the file by
  42. * specifying the <channel> argument. 
  43. *
  44. * Valid values for the <flags> parameter can be:
  45. * EXPAND  ../../../include/wtxtypes.h WTX_OPEN_FLAG
  46. *
  47. * or host specific flags (O_RDONLY etc...) as defined in sys/fcntl.h. The 
  48. * latter are accepted for backward compatibility but should no longer be 
  49. * used.
  50. *
  51. * WINDOWS HOSTS
  52. * If target server runs on a WINDOWS host, the RDONLY flags are not supported.
  53. * If an RDONLY flag is given for <flags> variable, a WTX_ERR_SVR_INVALID_FLAGS
  54. * error will be returned. This is due to the lack of pipe opening on WINDOWS
  55. * hosts.
  56. *
  57. * NOTE: <fileName> must specify a file accessible from the host where the
  58. * target server is running.
  59. *
  60. * RETURNS: A file descriptor on success or WTX_ERROR if the open fails.
  61. *
  62. * SEE ALSO: WTX_OPEN, wtxFileClose()
  63. */
  64. INT32 wtxFileOpen 
  65.     (
  66.     HWTX   hWtx, /* WTX API handle */
  67.     const char *  fileName, /* file name */
  68.     WTX_OPEN_FLAG flags, /* unix style flags */
  69.     INT32   mode, /* unix style mode */
  70.     INT32   channel /* channel id for redirection */
  71.     )
  72.     {
  73.     WTX_ERROR_T callStat;
  74.     WTX_MSG_OPEN_DESC in;
  75.     WTX_MSG_RESULT out;
  76.     INT32 fileId;
  77.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  78.     memset (&in, 0, sizeof (WTX_MSG_OPEN_DESC));
  79.     memset (&out, 0, sizeof (WTX_MSG_RESULT));
  80.     in.filename = (char *) fileName;
  81.     in.flags = flags;
  82.     in.mode = mode;
  83.     in.channel = channel;
  84.     callStat = exchange (hWtx, WTX_OPEN, &in, &out);
  85.     if (callStat != WTX_ERR_NONE)
  86. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  87.     fileId = out.val.value_u.v_int32;
  88.     wtxExchangeFree (hWtx->server, WTX_OPEN, &out);
  89.     return fileId;
  90.     }
  91. /*******************************************************************************
  92. *
  93. * wtxHwBreakpointAdd - create a new WTX eventpoint of type hardware breakpoint
  94. *
  95. * This routine creates a new eventpoint on the target to represent a
  96. * hardware breakpoint of type <type> at the address <tgtAddr> for the 
  97. * target context <contextId>. The target server maintains a list of 
  98. * eventpoints created on the target and this can be queried using 
  99. * wtxEventpointList().  When a context is destroyed on the target or the 
  100. * target is reset, eventpoints are deleted automatically without 
  101. * intervention from the creator.
  102. *
  103. * When <contextType> is set to WTX_CONTEXT_SYSTEM, then only eventpoints in 
  104. * system mode can be added. 
  105. * When <contextType> is set to WTX_CONTEXT_TASK, then only eventpoints in 
  106. * context task can be added.
  107. *
  108. * The context types are given by:
  109. *
  110. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  111. *
  112. * NOTE
  113. * The types of hardware breakpoints vary with the architectures.
  114. * Generally, a hardware breakpoint can be a data breakpoint or an
  115. * instruction breakpoint.
  116. *
  117. * RETURNS: The ID of the new breakpoint or WTX_ERROR if the add fails.
  118. *
  119. * SEE ALSO: WTX_EVENTPOINT_ADD_2, wtxEventpointAdd(), wtxEventpointDelete(),
  120. * wtxEventpointList(), wtxBreakpointAdd()
  121. */
  122. UINT32 wtxHwBreakpointAdd 
  123.     (
  124.     HWTX hWtx, /* WTX API handle */
  125.     WTX_CONTEXT_TYPE contextType, /* type of context to put bp in */
  126.     WTX_CONTEXT_ID_T contextId, /* associated context */
  127.     TGT_ADDR_T tgtAddr, /* breakpoint address */
  128.     TGT_INT_T type /* access type (arch dependant) */
  129.     )
  130.     {
  131.     WTX_MSG_RESULT out;
  132.     WTX_MSG_EVTPT_DESC_2 in;
  133.     WTX_ERROR_T callStat;
  134.     UINT32 hwBpId; /* hardware breakpoint ID */
  135.     TGT_ARG_T args[3];
  136.     
  137.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  138.     memset (&out, 0, sizeof (out));
  139.     memset (&in, 0, sizeof (in));
  140.     /* fill event field */
  141.     in.wtxEvtpt.event.eventType = WTX_EVENT_HW_BP;
  142.     in.wtxEvtpt.event.args = args;
  143.     in.wtxEvtpt.event.numArgs = (TGT_ARG_T) 3; /* Number of arguments  */
  144.     in.wtxEvtpt.event.args[0] = (TGT_ARG_T) tgtAddr; /* bkpt address */
  145.     in.wtxEvtpt.event.args[1] = (TGT_ARG_T) 0; /* bkpt count */
  146.     in.wtxEvtpt.event.args[2] = (TGT_ARG_T) type; /* hw bkpt type */
  147.     /* fill context field */
  148.     in.wtxEvtpt.context.contextType = contextType;
  149.     in.wtxEvtpt.context.contextId = contextId;
  150.     /* fill action field */
  151.     in.wtxEvtpt.action.actionType = WTX_ACTION_STOP|WTX_ACTION_NOTIFY; 
  152.     in.wtxEvtpt.action.actionArg = 0;
  153.     in.wtxEvtpt.action.callRtn = 0;
  154.     in.wtxEvtpt.action.callArg = 0;
  155.     callStat = exchange (hWtx, WTX_EVENTPOINT_ADD_2, &in, &out);
  156.     if (callStat != WTX_ERR_NONE)
  157. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  158.     hwBpId = out.val.value_u.v_uint32; 
  159.     wtxExchangeFree (hWtx->server, WTX_EVENTPOINT_ADD_2, &out);
  160.     return hwBpId;
  161.     }
  162. /*******************************************************************************
  163. *
  164. * wtxSymListFree - free memory used to store symbols in a list
  165. *
  166. * This routine frees the memory associated with each node in a symbol list.
  167. *
  168. * The symbol list to free is defined by:
  169. *
  170. * EXPAND ../../../include/wtxmsg.h WTX_SYM_LIST
  171. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  172. *
  173. * RETURNS: N/A
  174. */
  175.  
  176. void wtxSymListFree
  177.     (
  178.     WTX_SYM_LIST * pSymList /* symbol list to free */
  179.     )
  180.     {
  181.     WTX_SYMBOL * pCurSym; /* current symbol in list */
  182.     WTX_SYMBOL * pNextSym; /* next symbol in list */
  183.     if (pSymList == NULL)
  184. return;
  185.  
  186.     pCurSym = pSymList->pSymbol; /* get first node in list */
  187.  
  188.     if(pCurSym == 0) /* list is empty nothing to free */
  189. return;
  190.  
  191.     pNextSym = (WTX_SYMBOL *) pCurSym->next; /* get next node pointer */
  192.     if (pCurSym->name != NULL)
  193. {
  194. free (pCurSym->name); /* free name space */
  195. }
  196.     if (pCurSym->moduleName != NULL)
  197. {
  198. free (pCurSym->moduleName); /* free module name space */
  199. }
  200.     free (pCurSym); /* free first node space */
  201.  
  202.     while(pNextSym != NULL)
  203. {
  204. pCurSym  = pNextSym; /* go to next node */
  205. pNextSym = (WTX_SYMBOL *) pCurSym->next;
  206.  
  207. if (pCurSym->name != NULL)
  208.     {
  209.     free (pCurSym->name); /* free name space */
  210.     }
  211. if (pCurSym->moduleName != NULL)
  212.     {
  213.     free (pCurSym->moduleName); /* free module name space */
  214.     }
  215. free (pCurSym); /* free list node space */
  216. }
  217.     }
  218. /*******************************************************************************
  219. * wtxResultFree - free the memory used by a WTX API call result
  220. *
  221. * This routine frees the memory allocated for the result of a WTX API
  222. * call.  <pResult> must point to a WTX structure that was returned by
  223. * a WTX API call.
  224. *
  225. * The routine always returns WTX_OK, except if the WTX handler is invalid. This
  226. * is to avoid overriding previously set WTX errors.
  227. *
  228. * NOTE: To ensure correct and complete freeing of memory allocated to
  229. * API call results, use wtxResultFree() to free target server call
  230. * results before calling wtxToolDetach() and to free registry call results 
  231. * before calling wtxTerminate().
  232. *
  233. * RETURNS: WTX_OK or WTX_ERROR if the WTX handler is invalid.
  234. */
  235. STATUS wtxResultFree
  236.     (
  237.     HWTX hWtx, /* WTX session handler     */
  238.     void * pToFree /* pointer to be freed     */
  239.     )
  240.     {
  241.     WTX_FREE_NODE * pWtxFreeNode = NULL; /* wtxResultFree node desc */
  242.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  243.     /* first check that the pointer is not NULL */
  244.     if ((pToFree == NULL) || (hWtx->pWtxFreeList == NULL) )
  245. {
  246. goto error;
  247. }
  248.     /* now we can look in the list */
  249.     if ( (pWtxFreeNode = (WTX_FREE_NODE *) sllEach (hWtx->pWtxFreeList,
  250.     wtxPtrMatch, (int) pToFree))
  251.  == NULL)
  252. {
  253. goto error;
  254. }
  255.     /*
  256.      * the pointer pToFree has been found in list, free it by calling the
  257.      * associated routine
  258.      * if pWtxFreeNode->pFreeFunc is set to NULL, it means that we have to
  259.      * free pWtxFreeNode->pToFree using the RPC free routines
  260.      */
  261.     if (pWtxFreeNode->pFreeFunc != NULL)
  262. {
  263. pWtxFreeNode->pFreeFunc (pWtxFreeNode->pToFree);
  264. }
  265.     else
  266. {
  267. if (pWtxFreeNode->server != NULL)
  268.     {
  269.     wtxExchangeFree (pWtxFreeNode->server, pWtxFreeNode->svcNum,
  270.      pWtxFreeNode->pMsgToFree);
  271.     }
  272. }
  273.     /* if the pMsgToFree pointer is not NULL, we have to free it too */
  274.     if ( pWtxFreeNode->pMsgToFree != NULL)
  275. {
  276. free (pWtxFreeNode->pMsgToFree);
  277. }
  278.     sllRemove (hWtx->pWtxFreeList, (SL_NODE *) pWtxFreeNode,
  279.        sllPrevious ( (SL_LIST *) hWtx->pWtxFreeList, 
  280.      (SL_NODE *) pWtxFreeNode));
  281.     free (pWtxFreeNode);
  282. error:
  283.     return (WTX_OK);
  284.     }
  285. /*******************************************************************************
  286. *
  287. * wtxFreeAdd - adds an element in the wtxResultFree() list
  288. *
  289. * This routine adds a new element in the wtxResultFree() list. It creates a new
  290. * element in the list. The given <pToFree> and <pFreeFunc> are assigned to the
  291. * new elemetn <pToFree> and <pFreeFunc> fields.
  292. *
  293. * .iP hWtx 10 3
  294. * The WTX session handler. It allows this routine to return an error message if
  295. * one request fails.
  296. * .iP pToFree
  297. * Basically the pointer that is to be freed by a call to <pFreeFunc>
  298. * .iP pFreeFunc
  299. * The address of the routine to use to free <pToFree>
  300. * .iP pMsgToFree
  301. * The <pToFree> pointer may be embedded inside a WTX message. In that case, the
  302. * message also has to be freed. The free() routine is used to free <pMsgToFree>.
  303. * If <pToFree> is not embedded inside a WTX message, <pMsgToFree> should be set
  304. * to NULL.
  305. * .iP svcNum
  306. * When <pToFree> uses the RPC free routines, this variable should be set to the
  307. * WTX_REQUEST number of the service that allocated this RPC message. This
  308. * variable will be evaluated only if the <pFreeFunc> routine pointer is set to
  309. * NULL.
  310. * .iP server
  311. * If <svcNum> is evaluated, the <server> variable specifies the RPC server to
  312. * connect to.
  313. * .lE
  314. *
  315. * RETURNS: WTX_OK or WTX_ERROR
  316. *
  317. */
  318. STATUS wtxFreeAdd
  319.     (
  320.     HWTX hWtx, /* wtx session handler            */
  321.     void * pToFree, /* pointer to be freed            */
  322.     FUNCPTR pFreeFunc, /* routine to use to free pToFree */
  323.     void * pMsgToFree, /* message to free if needed      */
  324.     WTX_REQUEST svcNum, /* service num to free if needed  */
  325.     WTX_XID server, /* RPC server to connect to       */
  326.     WTX_SVR_TYPE svrType /* server to connect type         */
  327.     )
  328.     {
  329.     WTX_FREE_NODE * pFreeNode = NULL; /* new node in list       */
  330.     STATUS status = WTX_ERROR; /* routine return status  */
  331.     /* initialize the wtxResultFree list if needed */
  332.     if (hWtx->pWtxFreeList == NULL)
  333. {
  334. if ( (hWtx->pWtxFreeList = sllCreate ()) == NULL)
  335.     {
  336.     wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  337.     goto error;
  338.     }
  339. }
  340.     /*
  341.      * add the pointer in the wtxResultFree list so it can be freed later
  342.      * calling wtxResultFree()
  343.      */
  344.     if (pToFree == NULL)
  345. {
  346. /*
  347.  * pointer to free is NULL, just don't add it to the list, in order to
  348.  * not break the user's application, we just exit and send the WTX_OK
  349.  * status. There should not be any problem to do it.
  350.  */
  351. status = WTX_OK;
  352. goto error;
  353. }
  354.     /* allocate room for the new pointer description in the queue */
  355.     if ( (pFreeNode = calloc (1, sizeof (WTX_FREE_NODE))) == NULL)
  356. {
  357. wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  358. goto error;
  359. }
  360.     pFreeNode->pToFree = pToFree;
  361.     pFreeNode->pFreeFunc = pFreeFunc;
  362.     pFreeNode->pMsgToFree = pMsgToFree;
  363.     pFreeNode->svcNum = svcNum;
  364.     pFreeNode->server = server ;
  365.     pFreeNode->svrType = svrType;
  366.     sllPutAtTail ( (SL_LIST *) hWtx->pWtxFreeList, (SL_NODE *) pFreeNode);
  367.     status = WTX_OK;
  368. error:
  369.     return (status);
  370.     }
  371. /*******************************************************************************
  372. *
  373. * wtxPtrMatch - matches with a pointer value
  374. *
  375. * This routine is used by wtxResultFree() to match for the pointer to free in
  376. * the SL_LIST.
  377. *
  378. * RETURNS: TRUE if it matches, FALSE if different.
  379. *
  380. * NOMANUAL
  381. */
  382. LOCAL BOOL wtxPtrMatch
  383.     (
  384.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list */
  385.     void * pToMatch /* pointer value to find */
  386.     )
  387.     {
  388.     if (pToMatch == pWtxFreeNode->pToFree)
  389. {
  390. return (FALSE);
  391. }
  392.     else
  393. {
  394. return (TRUE);
  395. }
  396.     }
  397. /*******************************************************************************
  398. *
  399. * wtxResultFreeListTerminate - empty the wtxResultFree pointers list
  400. *
  401. * This routine is called by wtxTerminate() to free each of the remaining
  402. * pointers in the wtxResultFree() pointers list.
  403. *
  404. * RETURNS: TRUE in order to free all the nodes
  405. *
  406. * NOMANUAL
  407. */
  408. LOCAL BOOL wtxResultFreeListTerminate
  409.     (
  410.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list */
  411.     HWTX * hWtx /* WTX session handler            */
  412.     )
  413.     {
  414.     wtxResultFree ( (HWTX) (*hWtx), pWtxFreeNode->pToFree);
  415.     return (TRUE);
  416.     }
  417. /*******************************************************************************
  418. *
  419. * wtxResultFreeServerListTerminate - empty the wtxResultFree list for tgtsvr
  420. *
  421. * This routine is called by wtxToolDetach() to free each of the remaining
  422. * target server pointers in the wtxResultFree() pointers list.
  423. *
  424. * RETURNS: TRUE in order to free all the nodes
  425. *
  426. * NOMANUAL
  427. */
  428. LOCAL BOOL wtxResultFreeServerListTerminate
  429.     (
  430.     WTX_FREE_NODE * pWtxFreeNode, /* element in singaly linked list */
  431.     HWTX * hWtx /* WTX session handler            */
  432.     )
  433.     {
  434.     if (pWtxFreeNode->svrType == WTX_SVR_SERVER)
  435. {
  436. wtxResultFree ( (HWTX) (*hWtx), pWtxFreeNode->pToFree);
  437. }
  438.     return (TRUE);
  439.     }
  440. /*******************************************************************************
  441. *
  442. * wtxGopherEval - evaluate a Gopher string on the target 
  443. *
  444. * This routine evaluates the Gopher string <inputString> and populates
  445. * the Gopher result tape WTX_GOPHER_TAPE with the result
  446. * data. It is the caller's duty to free the result tape by calling
  447. * wtxResultFree().
  448. *
  449. * EXPAND ../../../include/wtxmsg.h WTX_GOPHER_TAPE
  450. *
  451. * The Gopher result tape is a byte-packed (opaque) data stream.  The data is a 
  452. * series of pairs, each consisting of a type
  453. * code and its associated data.  The type codes are defined in
  454. * the file .../wpwr/share/src/agents/wdb/wdb.h as follows:
  455. *
  456. * .CS
  457. *       /@ gopher stream format type codes @/
  458. *
  459. * #define GOPHER_UINT32           0
  460. * #define GOPHER_STRING           1
  461. * #define GOPHER_UINT16           2
  462. * #define GOPHER_UINT8            3
  463. * #define GOPHER_FLOAT32          4
  464. * #define GOPHER_FLOAT64          5
  465. * #define GOPHER_FLOAT80          6
  466. * .CE
  467. *
  468. * For an example showing how to format the Gopher result tape, see
  469. * .I API Programmer's Guide: The WTX Protocol.
  470. *
  471. * RETURNS: A pointer to the Gopher result tape or NULL on error.
  472. *
  473. * SEE ALSO: WTX_GOPHER_EVAL,
  474. * .I API Reference Manual: WTX Protocol WTX_GOPHER_EVAL,
  475. * .I API Programmer's Guide: The WTX Protocol
  476. */
  477. WTX_GOPHER_TAPE * wtxGopherEval 
  478.     (
  479.     HWTX   hWtx, /* WTX API handle */
  480.     const char *   inputString /* Gopher program to evaluate */
  481.     )
  482.     {
  483.     WTX_MSG_PARAM in;
  484.     WTX_MSG_GOPHER_TAPE * pOut;
  485.     WTX_ERROR_T callStat;
  486.     WTX_CHECK_CONNECTED (hWtx, NULL);
  487.     pOut = calloc (1, sizeof (WTX_MSG_GOPHER_TAPE));
  488.     if (pOut == NULL)
  489. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  490.     memset (&in, 0, sizeof (in));
  491.     in.param.valueType = V_PCHAR;
  492.     in.param.value_u.v_pchar = (char *) inputString;
  493.     callStat = exchange (hWtx, WTX_GOPHER_EVAL, &in, pOut);
  494.     if (callStat != WTX_ERR_NONE)
  495. {
  496. free (pOut); /* Free allocated message */
  497. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  498. }
  499.     /* add pointer to the wtxResultFree () list */
  500.     if (wtxFreeAdd (hWtx, (void *) &pOut->tape, NULL, pOut, WTX_GOPHER_EVAL,
  501.     hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  502. {
  503. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  504. }
  505.     return (&pOut->tape);
  506.     }
  507. /*******************************************************************************
  508. *
  509. * wtxLogging - WDB / WTX requests logging controls
  510. *
  511. * This function allows control of WDB / WTX requests logging. 
  512. * Options available for the WTX log request are:
  513. * .iP LOG_ON
  514. * Start the logging service
  515. * .iP LOG_OFF
  516. * Stop the logging service
  517. * .iP filename
  518. * Name where info will be written
  519. * .iP maxSize
  520. * Maximum size of the log file
  521. * .iP regExp
  522. * Regular expression used to filter events
  523. *
  524. * Options available for the WDB log request are:
  525. * .iP LOG_ON
  526. * Start the logging service
  527. * .iP LOG_OFF
  528. * Stop the logging service
  529. * .iP filename
  530. * Name where info will be written
  531. * .iP maxSize
  532. * Maximum size of the log file
  533. *
  534. * By default, there's no maximum size (<maxSize> is set to WTX_LOG_NO_LIMIT) 
  535. * and <regExp> is set to "WTX_EVENT_GET".
  536. *
  537. * EXAMPLE:
  538. *
  539. * Start the WTX logging with a file never bigger than 10000 bytes and 
  540. * containing all WTX requests except "WTX_TOOL_ATTACH".
  541. *
  542. * .CS
  543. *   wtxLogging (
  544. *              hWtx,                          /@ WTX API handle @/
  545. *              LOG_WTX,                       /@ WTX logging    @/
  546. *              LOG_ON,                        /@ start logging  @/
  547. *              "/folk/pascal/wtx.txt",        /@ log file name  @/
  548. *              10000,                         /@ log max size   @/
  549. *              "WTX_TOOL_ATTACH"              /@ never printed  @/
  550. *              );
  551. * .CE
  552. *
  553. * Start the WTX logging without size limit and with a default WTX 
  554. * requests filter.
  555. *
  556. * .CS
  557. *   wtxLogging (
  558. *              hWtx,                          /@ WTX API handle @/
  559. *              LOG_WTX,                       /@ WTX logging    @/
  560. *              LOG_ON,                        /@ start logging  @/
  561. *              "/folk/pascal/wtx.txt",        /@ log file name  @/
  562. *              WTX_LOG_NO_LIMIT,              /@ no max size    @/
  563. *              NULL                           /@ default filter @/
  564. *              );
  565. * .CE
  566. *
  567. * Stop the WTX and the WDB logging in one call: <fileName>, <maxSize> and 
  568. * <filter> are not used in this case and may be set to a default value.
  569. * .CS
  570. *   wtxLogging (
  571. *              hWtx,                          /@ WTX API handle @/
  572. *              LOG_ALL,                       /@ WTX WDB log    @/
  573. *              LOG_OFF,                       /@ stop logging   @/
  574. *              NULL,                          /@ not used       @/
  575. *              WTX_LOG_NO_LIMIT,              /@ not used       @/
  576. *              NULL                           /@ not used       @/
  577. *              );
  578. * .CE
  579. *
  580. * RETURNS: WTX_OK or WTX_ERROR
  581. *
  582. * ERRORS:
  583. * .iP WTX_ERR_API_INVALID_ARG 12
  584. * <fileName> is NULL or an argument is wrong
  585. *
  586. * SEE ALSO: WTX_COMMAND_SEND, 
  587. */
  588. STATUS wtxLogging
  589.     (
  590.     HWTX        hWtx,           /* WTX API handle                      */
  591.     int         type,           /* LOG_WDB, LOG_WTX or LOG_ALL logging */
  592.     int         action,         /* Logging LOG_ON or LOG_OFF           */
  593.     char *      fileName,       /* Logging file name                   */
  594.     int         maxSize,        /* log file max size                   */
  595.     char *      filter          /* Filter for the log file.            */
  596.     )
  597.     {
  598.     WTX_MSG_RESULT  out;
  599.     WTX_MSG_PARAM   in;
  600.     char            commandString [256];
  601.     WTX_ERROR_T     callStat;
  602.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  603.     memset (&out, 0, sizeof (out));
  604.     memset (&in, 0, sizeof (in));
  605.     /* Is it a WTX_LOGGING request ? */
  606.     if (type == LOG_WTX)
  607.         {
  608.         /* We want to activate the logging facilities */
  609.         if (action == LOG_ON)
  610.             {
  611.     /* Test the arguments */
  612.             if (fileName == NULL)
  613.                 WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  614.             if (maxSize < 0)
  615.                 WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  616.             if (filter == NULL)
  617.                 { 
  618.                 /* We have the max size */
  619.                 sprintf (commandString, "%s%s%s%s%d", WTX_LOGGING_ON_CMD, 
  620.                          SEPARATOR, fileName, SEPARATOR, maxSize);
  621.                 }
  622.             else
  623.                 {
  624.                 /* We have a filter for the log file */
  625.                 sprintf (commandString, "%s%s%s%s%d%s%s", WTX_LOGGING_ON_CMD,
  626.                          SEPARATOR, fileName, SEPARATOR, maxSize, SEPARATOR,
  627.                          filter);
  628.                 }
  629.             }
  630.         else
  631.             {
  632.             /* We want to stop the logging facilities */
  633.             if (action == LOG_OFF)
  634.                 {
  635.                 sprintf (commandString, "%s", WTX_LOGGING_OFF_CMD);
  636.                 }
  637.             /* This is an error */
  638.             else
  639.                 {
  640. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  641.                 }
  642.             }
  643.         }
  644.     else
  645.         {
  646.         /* Is it a WDB_LOGGING request ? */
  647.         if (type == LOG_WDB)
  648.             {
  649.             /* We want to activate the logging facilities */
  650.             if (action == LOG_ON)
  651.                 {
  652. /* Test the arguments */
  653.                 if (fileName == NULL)
  654.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  655.                 if (maxSize < 0)
  656.                     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR); 
  657.                 /* We have the max size */
  658.                 sprintf (commandString, "%s%s%s%s%d", WDB_LOGGING_ON_CMD,
  659.                          SEPARATOR, fileName, SEPARATOR, maxSize);
  660.                 }
  661.             else
  662.                 {
  663.                 /* We want to stop the logging facilities */
  664.                 if (action == LOG_OFF)
  665.                     {
  666.                     sprintf (commandString, "%s", WDB_LOGGING_OFF_CMD);
  667.                     }
  668.                 /* This is an error */
  669.                 else
  670.                     {
  671.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  672.                     }
  673.                 }
  674.             }
  675.         else
  676.             {
  677.             /* Is it a WTX_LOGGING & WDB_LOGGING <LOG_OFF> request ? */
  678.             if (type == LOG_ALL)
  679.                 {
  680.                 /* If this is <LOG_OFF>: OK */
  681.                 if (action == LOG_OFF)
  682.                     {
  683.                     sprintf (commandString, "%s", ALL_LOGGING_OFF_CMD);
  684.                     }
  685.                 else
  686.                     {
  687.                     /* This is an error */
  688.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  689.                     }
  690.                 }
  691.             else
  692.                 {
  693.                 /* Otherwise: error */
  694. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  695.                 }
  696.             }
  697.         }
  698.     in.param.valueType = V_PCHAR;
  699.     in.param.value_u.v_pchar = commandString;
  700.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  701.     if (callStat != WTX_ERR_NONE)
  702.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  703.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  704.     /* Tchao */
  705.     return (WTX_OK);
  706.     }
  707. /*******************************************************************************
  708. * wtxMemInfoGet - get information about the target-server-managed memory pool
  709. *
  710. * This routine queries the target server to find out information about
  711. * the target-server-managed target memory pool. The result is a pointer
  712. * to a WTX_MEM_INFO structure that must be freed by a user call to 
  713. * wtxResultFree().
  714. *
  715. * EXPAND ../../../include/wtx.h WTX_MEM_INFO
  716. *
  717. * RETURNS: Pointer to the module info or NULL on failure. 
  718. *
  719. * SEE ALSO: WTX_MEM_INFO_GET, wtxMemAlloc().
  720. */
  721. WTX_MEM_INFO * wtxMemInfoGet 
  722.     (
  723.     HWTX hWtx /* WTX API handle */
  724.     )
  725.     {
  726.     WTX_ERROR_T callStat; /* WTX status */
  727.     WTX_MSG_MEM_INFO * pOut;
  728.     WTX_CHECK_CONNECTED (hWtx, NULL);
  729.     
  730.     pOut = calloc (1, sizeof (WTX_MSG_MEM_INFO));
  731.     if (pOut == NULL)
  732. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  733.     callStat = exchange (hWtx, WTX_MEM_INFO_GET, &hWtx->msgToolId, pOut);
  734.     if (callStat != WTX_ERR_NONE)
  735. {
  736. free (pOut); /* free allocated message */
  737. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  738. }
  739.     /* add pointer to the wtxResultFree () list */
  740.     if (wtxFreeAdd (hWtx, (void *) &pOut->curBytesFree, NULL, pOut,
  741.     WTX_MEM_INFO_GET, hWtx->server, WTX_SVR_SERVER) != WTX_OK)
  742. {
  743. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  744. }
  745.     return ((WTX_MEM_INFO *) &pOut->curBytesFree);
  746.     }
  747. /*******************************************************************************
  748. * wtxMemAlloc - allocate a block of memory to the TS-managed target memory pool
  749. *
  750. * This routine allocates <numBytes> of memory on the target. The block
  751. * location and alignment are unspecified.
  752. * RETURNS: The address of the target memory allocated or NULL on error.
  753. *
  754. * SEE ALSO: WTX_MEM_ALLOC, wtxMemFree()
  755. */
  756. TGT_ADDR_T wtxMemAlloc 
  757.     (
  758.     HWTX hWtx, /* WTX API handle */
  759.     UINT32 numBytes /* size to allocate in bytes */
  760.     )
  761.     {
  762.     WTX_ERROR_T callStat;
  763.     WTX_MSG_PARAM in;
  764.     WTX_MSG_RESULT out;
  765.     TGT_ADDR_T result;
  766.     WTX_CHECK_CONNECTED (hWtx, 0);
  767.     memset (&in, 0, sizeof (in));
  768.     memset (&out, 0, sizeof (out));
  769.     in.param.valueType = V_UINT32;
  770.     in.param.value_u.v_uint32 = numBytes;
  771.     callStat = exchange (hWtx, WTX_MEM_ALLOC, &in, &out);
  772.     if (callStat != WTX_ERR_NONE)
  773. WTX_ERROR_RETURN (hWtx, callStat, 0);
  774.     result = out.val.value_u.v_tgt_addr;
  775.     wtxExchangeFree (hWtx->server, WTX_MEM_ALLOC, &out);
  776.     return result;
  777.     }
  778. /*******************************************************************************
  779. * wtxMemChecksum - perform a checksum on target memory
  780. *
  781. * This routine returns a checksum for <numBytes> of memory starting at
  782. * address <startAddr>. Errors must be detected by using the wtxErrXXX()
  783. * routines.
  784. *
  785. * RETURNS: A checksum value.
  786. *
  787. * SEE ALSO: WTX_MEM_CHECKSUM
  788. */
  789. UINT32 wtxMemChecksum
  790.     (
  791.     HWTX hWtx, /* WTX API handle */
  792.     TGT_ADDR_T startAddr, /* remote addr to start checksum at */
  793.     UINT32 numBytes /* number of bytes to checksum */
  794.     )
  795.     {
  796.     WTX_ERROR_T callStat;
  797.     WTX_MSG_MEM_SET_DESC in;
  798.     WTX_MSG_RESULT out;
  799.     UINT32 result;
  800.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  801.     memset (&in, 0, sizeof (in));
  802.     memset (&out, 0, sizeof (out));
  803.     in.startAddr = startAddr;
  804.     in.numItems = numBytes;
  805.     callStat = exchange (hWtx, WTX_MEM_CHECKSUM, &in, &out);
  806.     if (callStat != WTX_ERR_NONE)
  807. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  808.     result = out.val.value_u.v_uint32;
  809.     wtxExchangeFree (hWtx->server, WTX_MEM_CHECKSUM, &out);
  810.     return result;
  811.     }
  812. /*******************************************************************************
  813. * wtxMemMove - move a block of target memory
  814. *
  815. * This routine moves <numBytes> from <srcAddr> to <destAddr>.  Note that
  816. * the source and destination buffers may overlap.
  817. *
  818. * RETURNS: WTX_OK or WTX_ERROR.
  819. *
  820. * SEE ALSO: WTX_MEM_MOVE
  821. */
  822. STATUS wtxMemMove
  823.     (
  824.     HWTX hWtx, /* WTX API handle */
  825.     TGT_ADDR_T srcAddr, /* remote addr to move from */
  826.     TGT_ADDR_T destAddr, /* remote addr to move to */
  827.     UINT32 numBytes /* number of bytes to move */
  828.     )
  829.     {
  830.     WTX_ERROR_T callStat;
  831.     WTX_MSG_MEM_MOVE_DESC in;
  832.     WTX_MSG_RESULT out;
  833.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  834.     memset (&in, 0, sizeof (in));
  835.     memset (&out, 0, sizeof (out));
  836.     in.source = srcAddr;
  837.     in.destination = destAddr;
  838.     in.numBytes = numBytes;
  839.     callStat = exchange (hWtx, WTX_MEM_MOVE, &in, &out);
  840.     if (callStat != WTX_ERR_NONE)
  841. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  842.     wtxExchangeFree (hWtx->server, WTX_MEM_MOVE, &out);
  843.     return (WTX_OK);
  844.     }
  845. /*******************************************************************************
  846. * wtxMemFree - free a block of target memory
  847. *
  848. * This routine frees a target memory block previously allocated with
  849. * wtxMemAlloc().
  850. * RETURNS: WTX_OK or WTX_ERROR.
  851. *
  852. * SEE ALSO: WTX_MEM_FREE, wtxMemAlloc()
  853. */
  854. STATUS wtxMemFree 
  855.     (
  856.     HWTX hWtx, /* WTX API handle */
  857.     TGT_ADDR_T address /* target memory block address to free */
  858.     )
  859.     {
  860.     WTX_ERROR_T callStat;
  861.     WTX_MSG_PARAM in;
  862.     WTX_MSG_RESULT out;
  863.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  864.     memset (&in, 0, sizeof (in));
  865.     memset (&out, 0, sizeof (out));
  866.     in.param.valueType = V_TGT_ADDR;
  867.     in.param.value_u.v_tgt_addr = address;
  868.     callStat = exchange (hWtx, WTX_MEM_FREE, &in, &out);
  869.     if (callStat != WTX_ERR_NONE)
  870. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  871.     wtxExchangeFree (hWtx->server, WTX_MEM_FREE, &out);
  872.     return (WTX_OK);
  873.     }
  874. /*******************************************************************************
  875. * wtxMemRead - read memory from the target
  876. *
  877. * This routine reads <numBytes> of memory from the target starting at 
  878. * <fromAddr> and writes the contents to <toAddr>. 
  879. *
  880. * NOTE: Because the target agent tests that all memory is readable,
  881. * this routine can never do a partial read. The return value is
  882. * always <numBytes> or WTX_ERROR.
  883. * ERRORS:
  884. * .iP WTX_ERR_API_INVALID_ARG 12
  885. * <toAddr> or <numBytes> is invalid.
  886. *
  887. * RETURNS: The number of bytes read (see note) or WTX_ERROR.
  888. * SEE ALSO: WTX_MEM_READ, wtxMemWrite()
  889. */
  890. UINT32 wtxMemRead 
  891.     (
  892.     HWTX hWtx, /* WTX API handle */
  893.     TGT_ADDR_T fromAddr, /* Target addr to read from */
  894.     void * toAddr, /* Local addr to read to */
  895.     UINT32 numBytes /* Bytes to read */
  896.     )
  897.     {
  898.     WTX_ERROR_T callStat;
  899.     WTX_MSG_MEM_READ_DESC in;
  900.     WTX_MSG_MEM_COPY_DESC out;
  901.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  902.     if ((toAddr == 0) || (numBytes == 0))
  903.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  904.     memset (&in, 0, sizeof (in));
  905.     memset (&out, 0, sizeof (out));
  906.     in.source = fromAddr;
  907.     in.destination = (UINT32) toAddr;
  908.     in.numBytes = numBytes;
  909.     callStat = exchange (hWtx, WTX_MEM_READ, &in, &out);
  910.     if (callStat != WTX_ERR_NONE)
  911. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  912.     wtxExchangeFree (hWtx->server, WTX_MEM_READ, &out);
  913.     /* NOTE : WTX_MEM_READ can only read 0 or all of the bytes, hence the
  914.      * return value is actually 0 (a status code == WTX_OK) when all is
  915.      * well.
  916.      */
  917.     return numBytes;
  918.     }
  919. /*******************************************************************************
  920. *
  921. * wtxMemWidthRead - read memory from the target
  922. *
  923. * This routine reads <numBytes> (on <width> bytes large) from the target 
  924. * starting at <fromAddr> and writes the contents to <toAddr>.
  925. *
  926. * NOTE: Because the target agent tests that all memory is readable,
  927. * this routine can never do a partial read. The return value is
  928. * always <numBytes> or WTX_ERROR.
  929. *
  930. * NOTE: This request is not implemented on WDB side, wtxMemWidthRead()
  931. * is mapped on wtxMemRead() and the <width> parameter is simply ignored.
  932. * ERRORS:
  933. * .iP WTX_ERR_API_INVALID_ARG 12
  934. * <toAddr>, <numBytes> or <width> is invalid
  935. *
  936. * RETURNS: The number of bytes read (see note) or WTX_ERROR.
  937. *
  938. * SEE ALSO: WTX_MEM_WIDTH_READ, wtxMemRead(), wtxMemWidthWrite()
  939. */
  940. UINT32 wtxMemWidthRead
  941.     (
  942.     HWTX        hWtx,                      /* WTX API handle           */
  943.     TGT_ADDR_T  fromAddr,                  /* Target addr to read from */
  944.     void *      toAddr,                    /* Local addr to read to    */
  945.     UINT32      numBytes,                  /* Bytes to read            */
  946.     UINT8       width                      /* Value width in bytes     */
  947.     )
  948.     {
  949.     WTX_ERROR_T                 callStat;
  950.     WTX_MSG_MEM_WIDTH_READ_DESC in;
  951.     WTX_MSG_MEM_COPY_DESC       out;
  952.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  953.     if ((toAddr == 0) || (numBytes == 0))
  954. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  955.     if ((width != 1) && (width != 2) && (width != 4))
  956. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  957.     memset (&in, 0, sizeof (in));
  958.     memset (&out, 0, sizeof (out));
  959.     in.source = fromAddr;
  960.     in.destination = (UINT32) toAddr;
  961.     in.numBytes = numBytes;
  962.     in.width = width;
  963.     callStat = exchange (hWtx, WTX_MEM_WIDTH_READ, &in, &out);
  964.     if (callStat != WTX_ERR_NONE)
  965.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  966.     wtxExchangeFree (hWtx->server, WTX_MEM_WIDTH_READ, &out);
  967.     /*
  968.      * NOTE : WTX_MEM_WIDTH_READ can only read 0 or all of the bytes, hence the
  969.      * return value is actually 0 (a status code == WTX_OK) when all is
  970.      * well.
  971.      */
  972.     return (numBytes);
  973.     }
  974. /*******************************************************************************
  975. * wtxMemWrite - write memory on the target
  976. *
  977. * This routine writes <numBytes> of memory to <toAddr> on the target from
  978. * the local address <fromAddr>. 
  979. *
  980. * NOTE: Because the target agent tests that all memory is writable,
  981. * this routine can never do a partial write. The return value is
  982. * always <numBytes> or WTX_ERROR.
  983. * ERRORS:
  984. * .iP WTX_ERR_API_INVALID_ARG 12
  985. * <fromAddr> or <numBytes> is invalid.
  986. *
  987. * RETURNS: The number of bytes written (see note) or WTX_ERROR. 
  988. *
  989. * SEE ALSO: WTX_MEM_WRITE, wtxMemRead()
  990. */
  991. UINT32 wtxMemWrite 
  992.     (
  993.     HWTX hWtx, /* WTX API handle */
  994.     void * fromAddr, /* Local addr to write from */
  995.     TGT_ADDR_T toAddr, /* Remote addr to write to */
  996.     UINT32 numBytes /* Bytes to read */
  997.     )
  998.     {
  999.     WTX_ERROR_T callStat;
  1000.     WTX_MSG_MEM_COPY_DESC in;
  1001.     WTX_MSG_RESULT out;
  1002.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1003.     if ((fromAddr == 0) || (numBytes == 0))
  1004.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1005.     memset (&in, 0, sizeof (in));
  1006.     memset (&out, 0, sizeof (out));
  1007.     in.source = (UINT32) fromAddr;
  1008.     in.destination = toAddr;
  1009.     in.numBytes = numBytes;
  1010.     callStat = exchange (hWtx, WTX_MEM_WRITE, &in, &out);
  1011.     if (callStat != WTX_ERR_NONE)
  1012. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1013.     wtxExchangeFree (hWtx->server, WTX_MEM_WRITE, &out);
  1014.     /* NOTE : WTX_MEM_WRITE can only write 0 or all of the bytes, hence the
  1015.      * return value is actually 0 (a status code == WTX_OK) when all is
  1016.      * well.
  1017.      */
  1018.     return numBytes;
  1019.     }
  1020. /*******************************************************************************
  1021. *
  1022. * wtxMemWidthWrite - write memory on the target
  1023. *
  1024. * This routine writes <numBytes> (on <width> bytes large) at <toAddr>
  1025. * on the target from the local address <fromAddr>.
  1026. *
  1027. * NOTE: Because the target agent tests that all memory is writable,
  1028. * this routine can never do a partial write. The return value is
  1029. * always <numBytes> or WTX_ERROR.
  1030. *
  1031. * NOTE: This request is not implemented on WDB side,
  1032. * wtxMemWidthWrite() is mapped on wtxMemWrite() and the <width> parameter is
  1033. * simply ignored.
  1034. *
  1035. * ERRORS:
  1036. * .iP WTX_ERR_API_INVALID_ARG 12
  1037. * <fromAddr>, <numBytes> or <width> is invalid
  1038. *
  1039. * RETURNS: The number of bytes written (see note) or WTX_ERROR.
  1040. *
  1041. * SEE ALSO: WTX_MEM_WIDTH_WRITE, wtxMemWrite(), wtxMemWidthRead()
  1042. */
  1043. UINT32 wtxMemWidthWrite
  1044.     (
  1045.     HWTX        hWtx,                      /* WTX API handle             */
  1046.     void *      fromAddr,                  /* Local addr to write from   */
  1047.     TGT_ADDR_T  toAddr,                    /* Remote addr to write to    */
  1048.     UINT32      numBytes,                  /* Bytes to read              */
  1049.     UINT8       width                      /* Width value: 1, 2, 4 bytes */
  1050.     )
  1051.     {
  1052.     WTX_ERROR_T                 callStat;
  1053.     WTX_MSG_MEM_WIDTH_COPY_DESC in;
  1054.     WTX_MSG_RESULT              out;
  1055.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1056.     memset (&in, 0, sizeof (in));
  1057.     memset (&out, 0, sizeof (out));
  1058.     if ((fromAddr == 0) || (numBytes == 0))
  1059. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1060.     if ((width != 1) && (width != 2) && (width != 4))
  1061. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1062.     in.source = (UINT32) fromAddr;
  1063.     in.destination = toAddr;
  1064.     in.numBytes = numBytes;
  1065.     in.width = width;
  1066.     callStat = exchange (hWtx, WTX_MEM_WIDTH_WRITE, &in, &out);
  1067.     if (callStat != WTX_ERR_NONE)
  1068.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1069.     wtxExchangeFree (hWtx->server, WTX_MEM_WIDTH_WRITE, &out);
  1070.     /*
  1071.      * NOTE : WTX_MEM_WIDTH_WRITE can only write 0 or all of the bytes, hence
  1072.      * the return value is actually 0 (a status code == WTX_OK) when all is
  1073.      * well.
  1074.      */
  1075.     return (numBytes);
  1076.     }
  1077. /*******************************************************************************
  1078. * wtxMemSet - set target memory to a given value
  1079. *
  1080. * This routine sets <numBytes> at address <addr> to the value <val>.
  1081. *
  1082. * RETURNS: WTX_OK or WTX_ERROR.
  1083. *
  1084. * SEE ALSO: WTX_MEM_SET
  1085. */
  1086. UINT32 wtxMemSet 
  1087.     (
  1088.     HWTX hWtx, /* WTX API handle */
  1089.     TGT_ADDR_T addr, /* remote addr to write to */
  1090.     UINT32 numBytes, /* number of bytes to set */
  1091.     UINT32 val /* value to set */
  1092.     )
  1093.     {
  1094.     WTX_ERROR_T callStat;
  1095.     WTX_MSG_MEM_SET_DESC in;
  1096.     WTX_MSG_RESULT out;
  1097.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1098.     memset (&in, 0, sizeof (in));
  1099.     memset (&out, 0, sizeof (out));
  1100.     in.startAddr = addr;
  1101.     in.width  = 1;
  1102.     in.numItems = numBytes;
  1103.     in.value  = (UINT32) val;
  1104.     callStat = exchange (hWtx, WTX_MEM_SET, &in, &out);
  1105.     if (callStat != WTX_ERR_NONE)
  1106. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1107.     wtxExchangeFree (hWtx->server, WTX_MEM_SET, &out);
  1108.     return (WTX_OK);
  1109.     }
  1110. /******************************************************************************
  1111. *
  1112. * wtxMemAddToPool - add memory to the agent pool
  1113. *
  1114. * This function adds the block of memory starting at <address> and spanning
  1115. * <size> bytes to the agent pool, enlarging it.  It is possible to enlarge
  1116. * the agent pool with memory obtained from the runtime memory manager
  1117. * or with any currently unclaimed memory.
  1118. *
  1119. * RETURNS: WTX_OK or WTX_ERROR.
  1120. *
  1121. * SEE ALSO: WTX_MEM_ADD_TO_POOL, wtxMemInfoGet(), wtxMemAlloc(), 
  1122. * wtxMemRealloc(), wtxMemFree()
  1123. */
  1124. STATUS wtxMemAddToPool
  1125.     (
  1126.     HWTX hWtx, /* WTX API handle */
  1127.     TGT_ADDR_T address, /* base of memory block to add */
  1128.     UINT32 size /* size of memory block to add */
  1129.     )
  1130.     {
  1131.     WTX_ERROR_T      callStat;
  1132.     WTX_MSG_MEM_BLOCK_DESC in;
  1133.     WTX_MSG_RESULT out;
  1134.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1135.     memset (&in, 0, sizeof (in));
  1136.     memset (&out, 0, sizeof (out));
  1137.     in.startAddr = address;
  1138.     in.numBytes  = size;
  1139.     callStat = exchange (hWtx, WTX_MEM_ADD_TO_POOL, &in, &out);
  1140.     if (callStat != WTX_ERR_NONE)
  1141. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1142.     wtxExchangeFree (hWtx->server, WTX_MEM_ADD_TO_POOL, &out);
  1143.     return (WTX_OK);
  1144.     }
  1145. /******************************************************************************
  1146. *
  1147. * wtxMemRealloc - reallocate a block of target memory
  1148. *
  1149. * This function changes the size of the block starting at <address> to 
  1150. * <numBytes> bytes and returns the address of the block (which may have moved).
  1151. *
  1152. * RETURNS: The address of the target memory reallocated or NULL on error.
  1153. *
  1154. * SEE ALSO: WTX_MEM_REALLOC, wtxMemAlloc()
  1155. */
  1156. TGT_ADDR_T wtxMemRealloc
  1157.     (
  1158.     HWTX hWtx, /* WTX API handle */
  1159.     TGT_ADDR_T address, /* memory block to reallocate */
  1160.     UINT32 numBytes /* new size */
  1161.     )
  1162.     {
  1163.     WTX_ERROR_T callStat;
  1164.     WTX_MSG_MEM_BLOCK_DESC in;
  1165.     WTX_MSG_RESULT out;
  1166.     TGT_ADDR_T result;
  1167.     WTX_CHECK_CONNECTED (hWtx, 0);
  1168.     memset (&in, 0, sizeof (in));
  1169.     memset (&out, 0, sizeof (out));
  1170.     in.startAddr = address;
  1171.     in.numBytes  = numBytes;
  1172.     callStat = exchange (hWtx, WTX_MEM_REALLOC, &in, &out);
  1173.     if (callStat != WTX_ERR_NONE)
  1174. WTX_ERROR_RETURN (hWtx, callStat, 0);
  1175.     result = out.val.value_u.v_tgt_addr;
  1176.     wtxExchangeFree (hWtx->server, WTX_MEM_REALLOC, &out);
  1177.     return result;
  1178.     }
  1179. /******************************************************************************
  1180. *
  1181. * wtxMemAlign - allocate aligned target memory
  1182. *
  1183. * This function allocates a block of memory of <numBytes> bytes aligned on 
  1184. * a <alignment>-byte boundary.  <alignment> must be a power of 2.
  1185. *
  1186. * RETURNS: The address of the target memory allocated or NULL on error.
  1187. *
  1188. * SEE ALSO: WTX_MEM_ALIGN, wtxMemAlloc()
  1189. */
  1190. TGT_ADDR_T wtxMemAlign
  1191.     (
  1192.     HWTX hWtx, /* WTX API handle */
  1193.     TGT_ADDR_T alignment, /* alignment boundary */
  1194.     UINT32 numBytes /* size of block to allocate */
  1195.     )
  1196.     {
  1197.     WTX_ERROR_T callStat;
  1198.     WTX_MSG_MEM_BLOCK_DESC in;
  1199.     WTX_MSG_RESULT out;
  1200.     TGT_ADDR_T result;
  1201.     WTX_CHECK_CONNECTED (hWtx, 0);
  1202.     memset (&in, 0, sizeof (in));
  1203.     memset (&out, 0, sizeof (out));
  1204.     in.startAddr = alignment;
  1205.     in.numBytes  = numBytes;
  1206.     callStat = exchange (hWtx, WTX_MEM_ALIGN, &in, &out);
  1207.     if (callStat != WTX_ERR_NONE)
  1208. WTX_ERROR_RETURN (hWtx, callStat, 0);
  1209.     result = out.val.value_u.v_tgt_addr;
  1210.     wtxExchangeFree (hWtx->server, WTX_MEM_ALIGN, &out);
  1211.     return result;
  1212.     }
  1213. /******************************************************************************
  1214. *
  1215. * wtxMemScan - scan target memory for the presence or absence of a pattern
  1216. *
  1217. * This routine scans the target memory from <startAddr> to <endAddr>.
  1218. * When <match> is set to TRUE, the first address containing the pattern
  1219. * pointed to by <pattern> is returned.  When <match> is
  1220. * FALSE, the first address not matching <pattern> is returned.
  1221. * <pattern> is a pointer to a host array of byte values of length
  1222. * <numBytes>. If the pattern cannot be found then an error is returned.
  1223. *
  1224. * RETURNS: WTX_OK or WTX_ERROR.
  1225. *
  1226. * SEE ALSO: WTX_MEM_SCAN
  1227. */
  1228. STATUS wtxMemScan 
  1229.     (
  1230.     HWTX hWtx, /* WTX API handle */
  1231.     BOOL32 match, /* Match/Not-match pattern boolean */
  1232.     TGT_ADDR_T startAddr, /* Target address to start scan */
  1233.     TGT_ADDR_T endAddr, /* Target address to finish scan */
  1234.     UINT32 numBytes, /* Number of bytes in pattern */
  1235.     void * pattern, /* Pointer to pattern to search for */
  1236.     TGT_ADDR_T * pResult /* Pointer to result address */
  1237.     )
  1238.     {
  1239.     WTX_ERROR_T callStat;
  1240.     WTX_MSG_MEM_SCAN_DESC in;
  1241.     WTX_MSG_RESULT out;
  1242.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1243.     if (pResult == NULL)
  1244. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1245.     memset (&in, 0, sizeof (in));
  1246.     memset (&out, 0, sizeof (out));
  1247.     in.startAddr = startAddr;
  1248.     in.endAddr = endAddr;
  1249.     in.numBytes = numBytes;
  1250.     in.pattern = pattern;
  1251.     in.match = match ; 
  1252.     callStat = exchange (hWtx, WTX_MEM_SCAN, &in, &out);
  1253.     if (callStat != WTX_ERR_NONE)
  1254. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1255.     *pResult = out.val.value_u.v_tgt_addr;
  1256.     wtxExchangeFree (hWtx->server, WTX_MEM_SCAN, &out);
  1257.     return (WTX_OK);
  1258.     }
  1259. /******************************************************************************
  1260. *
  1261. * wtxObjModuleChecksum - checks validity of target memory.
  1262. *
  1263. * This routine compares object module checksum on target with object module
  1264. * checksum in target server memory cache. This is a way to control the 
  1265. * target memory integrity. If <moduleId> is set to WTX_ALL_MODULE_ID or 
  1266. * <fileName> set to "WTX_ALL_MODULE_CHECK" then all modules will be checked. 
  1267. *
  1268. * NOTE:
  1269. * Because elf modules may have more than 1 section of text, text sections
  1270. * are gathered in a text segment. But, if on the target memory (or in the
  1271. * module) sections are contigous, they may not be contigous in the host 
  1272. * memory cache (due to different malloc for each sections). Then checksums
  1273. * cannot be compared for the text segment but only for the first text section.
  1274. *
  1275. * ERRORS:
  1276. * .iP WTX_ERR_API_MEMALLOC 12
  1277. * <fileName> buffer cannot be allocated
  1278. * .iP WTX_ERR_API_INVALID_ARG
  1279. * <moduleId> or <fileName> invalid
  1280. *
  1281. * RETURN: WTX_OK or WTX_ERROR if exchange failed
  1282. *
  1283. * SEE ALSO: WTX_OBJ_MODULE_CHECKSUM, wtxObjModuleList(), wtxMemChecksum()
  1284. */
  1285. STATUS wtxObjModuleChecksum
  1286.     (
  1287.     HWTX            hWtx,                  /* WTX API handle */
  1288.     INT32           moduleId,              /* Module Id      */
  1289.     char *          fileName               /* Module name    */
  1290.     )
  1291.     {
  1292.     WTX_ERROR_T                 callStat;
  1293.     WTX_MSG_MOD_NAME_OR_ID      in;
  1294.     WTX_MSG_RESULT              out;
  1295.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1296.     memset (&out, 0, sizeof (out));
  1297.     memset (&in, 0, sizeof (in));
  1298.     if ((moduleId == 0) || (moduleId == WTX_ERROR) || (fileName == NULL))
  1299. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  1300.  
  1301.     in.moduleId = moduleId;
  1302.     in.filename = fileName;
  1303.     if (moduleId == WTX_ALL_MODULE_ID)
  1304. {
  1305. if ((in.filename = (char *) malloc (strlen (WTX_ALL_MODULE_CHECK) + 1))
  1306.     == NULL)
  1307.     WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, WTX_ERROR);
  1308.         strcpy (in.filename, WTX_ALL_MODULE_CHECK);
  1309. }
  1310.     callStat = exchange (hWtx, WTX_OBJ_MODULE_CHECKSUM, &in, &out);
  1311.     if (callStat != WTX_ERR_NONE)
  1312.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1313.     wtxExchangeFree (hWtx->server, WTX_OBJ_MODULE_CHECKSUM, &out);
  1314.     return (WTX_OK);
  1315.     }
  1316. /*******************************************************************************
  1317. *
  1318. * wtxObjModuleFindId - find the ID of an object module given its name
  1319. *
  1320. * This routine returns the ID of the object module that was loaded
  1321. * from the file with the name <moduleName>.  The object name must not
  1322. * include any directory components as this is not stored in the
  1323. * object module.
  1324. *
  1325. * RETURNS: The object module ID or WTX_ERROR.
  1326. *
  1327. * SEE ALSO: WTX_OBJ_MODULE_FIND, wtxObjModuleFindName(), wtxObjModuleInfoGet()
  1328. */
  1329. UINT32 wtxObjModuleFindId 
  1330.     (
  1331.     HWTX hWtx, /* WTX API handle */
  1332.     const char * moduleName /* object module file name */
  1333.     )
  1334.     {
  1335.     WTX_MSG_MOD_NAME_OR_ID in;
  1336.     WTX_MSG_MOD_NAME_OR_ID out;
  1337.     WTX_ERROR_T    callStat;
  1338.     UINT32    moduleId;
  1339.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  1340.     memset (&in, 0, sizeof (in));
  1341.     memset (&out, 0, sizeof (out));
  1342.     in.filename = (char *) moduleName;
  1343.     callStat = exchange (hWtx, WTX_OBJ_MODULE_FIND, &in, &out);
  1344.     if (callStat != WTX_ERR_NONE)
  1345. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  1346.     moduleId = out.moduleId;
  1347.     wtxExchangeFree (hWtx->server, WTX_OBJ_MODULE_FIND, &out);
  1348.     return out.moduleId;
  1349.     }
  1350. /*******************************************************************************
  1351. *
  1352. * wtxObjModuleFindName - find object module name given its ID
  1353. *
  1354. * This routine returns the name of the object for the module that has
  1355. * the ID <moduleId>.  The name returned is the name of the object file
  1356. * from which it was loaded and does not include the directory where
  1357. * the object file was loaded. The returned string must be freed by
  1358. * the user calling wtxResultFree().
  1359. *
  1360. * ERRORS:
  1361. * .iP WTX_ERR_API_INVALID_ARG 12
  1362. * <moduleId> is invalid
  1363. *
  1364. * RETURNS: The object module filename or NULL.
  1365. *
  1366. * SEE ALSO: WTX_OBJ_MODULE_FIND, wtxObjModuleFindId(), wtxObjModuleInfoGet() 
  1367. */
  1368. char * wtxObjModuleFindName 
  1369.     (
  1370.     HWTX hWtx, /* WTX API handle                      */
  1371.     UINT32 moduleId /* id of module to find object name of */
  1372.     )
  1373.     {
  1374.     WTX_MSG_MOD_NAME_OR_ID * pOut = NULL;
  1375.     WTX_MSG_MOD_NAME_OR_ID in;
  1376.     WTX_ERROR_T callStat;
  1377.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1378.     memset (&in, 0, sizeof (in));
  1379.     if ((moduleId == 0) || (moduleId == (UINT32) WTX_ERROR))
  1380.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  1381.     /* arguments have been checked, allocate room for the out structure */
  1382.     pOut = (WTX_MSG_MOD_NAME_OR_ID *) calloc (1,
  1383.       sizeof (WTX_MSG_MOD_NAME_OR_ID));
  1384.     if (pOut == NULL)
  1385. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1386.     in.moduleId = moduleId;
  1387.     callStat = exchange (hWtx, WTX_OBJ_MODULE_FIND, &in, pOut);
  1388.     if (callStat != WTX_ERR_NONE)
  1389. {
  1390. free (pOut);
  1391. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1392. }
  1393.     /* add pointer to the wtxResultFree () list */
  1394.     if (wtxFreeAdd (hWtx, (void *) pOut->filename, NULL, pOut,
  1395.     WTX_OBJ_MODULE_FIND, hWtx->server, WTX_SVR_SERVER)
  1396. != WTX_OK)
  1397. {
  1398. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1399. }
  1400.     return (pOut->filename);
  1401.     }
  1402. /*******************************************************************************
  1403. *
  1404. * wtxObjModuleInfoGet - return information on a module given its module ID
  1405. *
  1406. * This routine returns a pointer to a module information structure for
  1407. * the module with the supplied ID <modId>. The module information must be
  1408. * freed by the user calling wtxResultFree().
  1409. *
  1410. * EXPAND ../../../include/wtx.h WTX_MODULE_INFO
  1411. *
  1412. * where OBJ_SEGMENT is:
  1413. *
  1414. * EXPAND ../../../include/wtxmsg.h OBJ_SEGMENT
  1415. *
  1416. * ERRORS:
  1417. * .iP WTX_ERR_API_INVALID_ARG 12
  1418. * <modId> is invalid
  1419. *
  1420. * RETURNS: A pointer to the module information structure or NULL on error.
  1421. *
  1422. * SEE ALSO: WTX_OBJ_MODULE_INFO_GET, wtxObjModuleList() 
  1423. */
  1424. WTX_MODULE_INFO * wtxObjModuleInfoGet 
  1425.     (
  1426.     HWTX   hWtx, /* WTX API handle */
  1427.     UINT32   modId /* id of module to look for */
  1428.     )
  1429.     {
  1430.     WTX_ERROR_T callStat;
  1431.     WTX_MSG_MOD_NAME_OR_ID in;
  1432.     WTX_MSG_MODULE_INFO * pOut;
  1433.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1434.     if ((modId == 0) || (modId == (UINT32) WTX_ERROR))
  1435.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  1436.     memset (&in, 0, sizeof (in));
  1437.     in.moduleId = modId;
  1438.     in.filename = NULL;
  1439.     pOut = calloc (1, sizeof (WTX_MSG_MODULE_INFO));
  1440.     if (pOut == NULL)
  1441. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1442.     callStat = exchange (hWtx, WTX_OBJ_MODULE_INFO_GET, &in, pOut);
  1443.     if (callStat != WTX_ERR_NONE)
  1444. {
  1445. free (pOut); /* Free allocated message */
  1446. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1447. }
  1448.     /* add pointer to the wtxResultFree () list */
  1449.     if (wtxFreeAdd (hWtx, (void *) &pOut->moduleId, NULL, pOut,
  1450.     WTX_OBJ_MODULE_INFO_GET, hWtx->server, WTX_SVR_SERVER)
  1451. != WTX_OK)
  1452. {
  1453. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1454. }
  1455.     return ((WTX_MODULE_INFO *) &pOut->moduleId);
  1456.     }
  1457. /*******************************************************************************
  1458. *
  1459. * wtxObjModuleInfoAndPathGet - return information on a module given its ID
  1460. *
  1461. * This routine returns a pointer to a module information structure for
  1462. * the module with the supplied ID <modId>. The module information must be
  1463. * freed by the user calling wtxResultFree().
  1464. *
  1465. * This request returned the complete pathname in the <name> field of the
  1466. * result.
  1467. *
  1468. * EXPAND ../../../include/wtx.h WTX_MODULE_INFO
  1469. *
  1470. * where OBJ_SEGMENT is:
  1471. *
  1472. * EXPAND ../../../include/wtxmsg.h OBJ_SEGMENT
  1473. *
  1474. * ERRORS:
  1475. * .iP WTX_ERR_API_INVALID_ARG 12
  1476. * <modId> is invalid
  1477. *
  1478. * RETURNS: A pointer to the module information structure or NULL on error.
  1479. *
  1480. * SEE ALSO: WTX_OBJ_MODULE_INFO_GET, wtxObjModuleInfoGet(), wtxObjModuleList() 
  1481. */
  1482. WTX_MODULE_INFO * wtxObjModuleInfoAndPathGet 
  1483.     (
  1484.     HWTX   hWtx, /* WTX API handle */
  1485.     UINT32   modId /* id of module to look for */
  1486.     )
  1487.     {
  1488.     WTX_ERROR_T callStat;
  1489.     WTX_MSG_MOD_NAME_OR_ID in;
  1490.     WTX_MSG_MODULE_INFO * pOut;
  1491.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1492.     if ((modId == 0) || (modId == (UINT32) WTX_ERROR))
  1493. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  1494.     memset (&in, 0, sizeof (in));
  1495.     in.moduleId = modId;
  1496.     in.filename = WTX_OBJ_MODULE_PATHNAME_GET;
  1497.     pOut = calloc (1, sizeof (WTX_MSG_MODULE_INFO));
  1498.     if (pOut == NULL)
  1499. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1500.     callStat = exchange (hWtx, WTX_OBJ_MODULE_INFO_GET, &in, pOut);
  1501.     if (callStat != WTX_ERR_NONE)
  1502. {
  1503. free (pOut); /* Free allocated message */
  1504. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1505. }
  1506.     /* add pointer to the wtxResultFree () list */
  1507.     if (wtxFreeAdd (hWtx, (void *) &pOut->moduleId, NULL, pOut,
  1508.     WTX_OBJ_MODULE_INFO_GET, hWtx->server, WTX_SVR_SERVER)
  1509. != WTX_OK)
  1510. {
  1511. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1512. }
  1513.     return ((WTX_MODULE_INFO *) &pOut->moduleId);
  1514.     }
  1515. /*******************************************************************************
  1516. *
  1517. * wtxObjModuleList - fetch a list of loaded object modules from the target
  1518. *
  1519. * This routine queries the target server symbol table for a list of
  1520. * loaded modules. A pointer to the module list is returned and must
  1521. * be freed by the caller using wtxResultFree().
  1522. *
  1523. * EXPAND ../../../include/wtx.h WTX_MODULE_LIST
  1524. *
  1525. * RETURNS: A pointer to the module list or NULL on error.
  1526. *
  1527. * SEE ALSO: WTX_OBJ_MODULE_LIST, wtxObjModuleInfoGet()
  1528. */
  1529. WTX_MODULE_LIST * wtxObjModuleList 
  1530.     (
  1531.     HWTX   hWtx /* WTX API handle */
  1532.     )
  1533.     {
  1534.     WTX_ERROR_T callStat;
  1535.     WTX_MSG_MODULE_LIST * pOut;
  1536.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1537.     pOut = calloc (1, sizeof (WTX_MSG_MODULE_LIST));
  1538.     if (pOut == NULL)
  1539. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1540.     callStat = exchange (hWtx, WTX_OBJ_MODULE_LIST, &hWtx->msgToolId, pOut);
  1541.     if (callStat != WTX_ERR_NONE)
  1542. {
  1543. free (pOut); /* Free allocated message */
  1544. WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1545. }
  1546.     /* add pointer to the wtxResultFree () list */
  1547.     if (wtxFreeAdd (hWtx, (void *) &pOut->numObjMod, NULL, pOut,
  1548.     WTX_OBJ_MODULE_LIST, hWtx->server, WTX_SVR_SERVER)
  1549. != WTX_OK)
  1550. {
  1551. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1552. }
  1553.     return ((WTX_MODULE_LIST *) &pOut->numObjMod);
  1554.     }
  1555. /*******************************************************************************
  1556. *
  1557. * wtxObjModuleLoad - Load a multiple section object file
  1558. *
  1559. * This routine loads a module onto the target and into the target server 
  1560. * module table. The caller should pass in a pointer to a WTX_LD_M_FILE_DESC 
  1561. * structure:
  1562. *
  1563. * EXPAND ../../../include/wtxmsg.h WTX_LD_M_FILE_DESC
  1564. *
  1565. * The user must set the `filename' field to the name of the file containing
  1566. * the object module and the `loadFlag' to the loader flags required:
  1567. * .iP LOAD_NO_SYMBOLS 12
  1568. * No symbols are added to the system symbol table
  1569. * .iP LOAD_LOCAL_SYMBOLS
  1570. * Only local symbols are added to the system symbol table
  1571. * .iP LOAD_GLOBAL_SYMBOLS
  1572. * Only external symbols are added to the system symbol table
  1573. * .iP LOAD_ALL_SYMBOLS
  1574. * All symbols are added to the system symbol table
  1575. * .iP LOAD_FULLY_LINKED
  1576. * No relocation is required
  1577. * .iP LOAD_NO_DOWNLOAD
  1578. * The module is not loaded on the target
  1579. * .iP LOAD_HIDDEN_MODULE
  1580. * Load the module but make it invisible to WTX_MSG_MODULE_LIST
  1581. * .iP LOAD_COMMON_MATCH_NONE
  1582. * Allocate common symbols, but do not search for any matching symbols (the
  1583. * default)
  1584. * .iP LOAD_COMMON_MATCH_USER
  1585. * Allocate common symbols, but search for matching symbols in user-loaded
  1586. * modules
  1587. * .iP LOAD_COMMON_MATCH_ALL
  1588. * Allocate common symbols, but search for matching symbols in user-loaded
  1589. * modules and the target-system core file
  1590. * .iP LOAD_BAL_OPTIM
  1591. * Use branch-and-link optimization (for i960 targets only)
  1592. * .iP LOAD_CPLUS_XTOR_AUTO
  1593. * C++ ctors/dtors management is explicitly turned on
  1594. * .iP LOAD_CPLUS_XTOR_MANUAL
  1595. * C++ ctors/dtors management is explicitly turned off
  1596. * .iP LOAD_MODULE_INFO_ONLY
  1597. * Create and initialize a module, do not load a file
  1598. * .LP
  1599. *
  1600. * When no section description is given and `nSections' is set to zero, the 
  1601. * host-based loader allocates memory for the text, data and bss sections of 
  1602. * the module using memory from the target memory pool. If the `nSections' 
  1603. * field is non-zero, the user can specify the location to load the sections 
  1604. * and the `section' field points to an array of section descriptors:
  1605. *
  1606. * EXPAND ../../../include/wtxmsg.h LD_M_SECTION
  1607. *
  1608. * If the load is successful, the return value is a pointer to a file descriptor
  1609. * for the new object module containing the actual information about the file 
  1610. * loaded.  If there are undefined symbols in the module, `undefSymList' points
  1611. * to a list of those symbols that were not resolved:
  1612. *
  1613. * EXPAND ../../../include/wtxmsg.h WTX_SYM_LIST
  1614. *
  1615. * EXPAND ../../../include/wtxmsg.h WTX_SYMBOL
  1616. *
  1617. * Use free() to free the input WTX_LD_M_FILE_DESC parameter and wtxResultFree()
  1618. * to free the output WTX_LD_M_FILE_DESC parameter.
  1619. *
  1620. * NOTE: COFF object modules with more than 3 sections are not supported.
  1621. *
  1622. * Files loaded on the target by the target server can be opened either by
  1623. * the target server or by the client. These two behaviors can be controled by
  1624. * <moduleId>: "WTX_LOAD_FROM_CLIENT" opens the file where the client is, 
  1625. * "WTX_LOAD_FROM_TARGET_SERVER" opens the file where the target server is.
  1626. *
  1627. * EXAMPLE:
  1628. * Load a module on the target, the file is opened either by the client or by
  1629. * the target server according to the place where the file is.
  1630. *
  1631. * .CS
  1632. *   ...
  1633. *
  1634. *   pFileDescIn->filename  = "/folk/pascal/Board/ads860/objSampleWtxtclTest2.o";
  1635. *   pFileDescIn->loadFlag  = LOAD_GLOBAL_SYMBOLS;
  1636. *   pFileDescIn->nSections = 0;
  1637. *   pFileDescIn->moduleId  = WTX_LOAD_FROM_CLIENT;
  1638. *
  1639. *   /@ Open the file locally @/
  1640. *
  1641. *   if (isTgtSvrLocal)
  1642. *       if((pFileDescOut = wtxObjModuleLoad (wtxh, pFileDescIn)) == NULL)
  1643. *     return (WTX_ERROR);
  1644. * else
  1645. *      {
  1646. *            /@ Do something @/
  1647. *
  1648. *      ... 
  1649. *            }
  1650. *        }
  1651. *    else /@ The target server opens the file @/
  1652. *        {
  1653. *        pFileDescIn->moduleId = WTX_LOAD_FROM_TARGET_SERVER;
  1654. *
  1655. *        if((pFileDescOut = wtxObjModuleLoad (wtxh, pFileDescIn)) == NULL)
  1656. *            return (WTX_ERROR);
  1657. *        else
  1658. *            {
  1659. *            /@ Do something @/
  1660. *
  1661. *      ...
  1662. *            }
  1663. *        }
  1664. *   ...
  1665. * .CE
  1666. *
  1667. * RETURNS: A pointer to a WTX_LD_M_FILE_DESC for the new module or NULL on
  1668. * error.
  1669. *
  1670. * ERRORS:
  1671. * .iP WTX_ERR_API_MEMALLOC 12
  1672. * A buffer cannot be allocated
  1673. * .iP WTX_ERR_API_INVALID_ARG
  1674. * filename is NULL
  1675. * .iP WTX_ERR_API_FILE_NOT_ACCESSIBLE
  1676. * filename doesn't exist or bad permission
  1677. * .iP WTX_ERR_API_FILE_NOT_FOUND
  1678. * Cant bind the path name to the file descriptor
  1679. * .iP WTX_ERR_API_NULL_SIZE_FILE
  1680. * File have a null size
  1681. * .iP WTX_ERR_API_CANT_READ_FROM_FILE
  1682. * Read in file failed
  1683. * .iP WTX_ERR_SVR_EINVAL
  1684. * Request issued out of sequence. A tool should not submit a load request if
  1685. * it already has one pending.
  1686. * .iP WTX_ERR_SVR_NOT_ENOUGH_MEMORY
  1687. * Cannot allocate memory for internal needs
  1688. * .iP WTX_ERR_TGTMEM_NOT_ENOUGH_MEMORY
  1689. * Not enough memory in the target-server-managed target memory pool to store the
  1690. * object module segments.
  1691. * .iP WTX_ERR_LOADER_XXX
  1692. * See WTX_OBJ_MODULE_LOAD
  1693. *
  1694. * SEE ALSO: WTX_OBJ_MODULE_LOAD_2, wtxObjModuleLoad(), wtxObjModuleUnload(),
  1695. * wtxObjModuleList(), wtxObjModuleInfoGet(), wtxObjModuleLoadStart(),
  1696. * wtxObjModuleLoadCancel(), wtxObjModuleLoadProgressReport(),
  1697. * .I API Reference Manual: Target Server Internal Routines,
  1698. * .I API Programmer's Guide: Object Module Loader
  1699. */
  1700. WTX_LD_M_FILE_DESC * wtxObjModuleLoad
  1701.     (
  1702.     HWTX                        hWtx,           /* WTX API handle    */
  1703.     WTX_LD_M_FILE_DESC *        pFileDesc       /* Module descriptor */
  1704.     )
  1705.     {
  1706.     WTX_MSG_FILE_LOAD_DESC      in;             /* Input value           */
  1707.     WTX_MSG_LD_M_FILE_DESC *    pOut;           /* Return value          */
  1708.     WTX_ERROR_T                 callStat;       /* Exchange return value */
  1709.     UINT32 scnIdx; /* Loop counter  */
  1710.     int fileNameLen=0; /* file name length      */
  1711. #ifdef HOST
  1712.     int                         fd;             /* File descriptor       */
  1713.     int                         fileSize;       /* Size of object module */
  1714.     int                         nBytes;         /* Number of bytes read  */
  1715.     char *                      buf;            /* Slice of file to load */
  1716. #ifndef WIN32
  1717.     struct stat                 infoFile;       /* Some info on the file */
  1718. #else
  1719.     struct _stat                infoFile;       /* Some info on the file */
  1720. #endif /* WIN 32 */
  1721. #endif /* HOST */
  1722.     WTX_CHECK_CONNECTED (hWtx, NULL);
  1723.     /* Initialize the input parameter */
  1724.     memset (&in, 0, sizeof (in));
  1725.     /* Output parameter location */
  1726.     pOut = (WTX_MSG_LD_M_FILE_DESC *) calloc (1, 
  1727.       sizeof (WTX_MSG_LD_M_FILE_DESC));
  1728.     if (pOut == NULL)
  1729.         {
  1730.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1731.         }
  1732.     pOut->wtxCore.protVersion = (UINT32) pOut;
  1733.     /* 
  1734.      * This ack is used to prevent garbage bits in moduleId :
  1735.      * - user can only set WTX_LOAD_FROM_XXX
  1736.      * - we can use WTX_LOAD_ASYNCHRONOUSLY & WTX_LOAD_PROGRESS_REPORT
  1737.      */
  1738.     if (!internalLoadCall)
  1739. pFileDesc->moduleId &= WTX_LOAD_FROM_TARGET_SERVER;
  1740.     else
  1741. internalLoadCall = FALSE;
  1742.     /* Set the asynchronous / progress report load flag if needed */
  1743.     if (pFileDesc->moduleId == WTX_LOAD_PROGRESS_REPORT)
  1744. {
  1745. wtxErrClear (hWtx);
  1746. in.flags = WTX_LOAD_PROGRESS_REPORT;
  1747.         callStat = exchange (hWtx, WTX_OBJ_MODULE_LOAD_2, &in, pOut);
  1748.         if (callStat != WTX_ERR_NONE) 
  1749.             {
  1750.     free (pOut);
  1751.             WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1752.             }
  1753. if (pOut->loadFlag == WTX_ERR_LOADER_LOAD_IN_PROGRESS)
  1754.     {
  1755.     wtxErrSet (hWtx, WTX_ERR_LOADER_LOAD_IN_PROGRESS);
  1756.     }
  1757. if (wtxFreeAdd (hWtx, (void *) ((int) pOut +
  1758. OFFSET (WTX_MSG_DUMMY, field)),
  1759. NULL, pOut, WTX_OBJ_MODULE_LOAD_2, hWtx->server,
  1760. WTX_SVR_SERVER) != WTX_OK)
  1761.     {
  1762.     WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1763.     }
  1764.         /* Output parameter */
  1765.         return ((WTX_LD_M_FILE_DESC *) ((int) pOut + 
  1766. OFFSET (WTX_MSG_DUMMY, field)));
  1767. }
  1768.     if (pFileDesc->moduleId & WTX_LOAD_ASYNCHRONOUSLY) 
  1769. {
  1770. in.flags = WTX_LOAD_ASYNCHRONOUSLY;
  1771. }
  1772.     else
  1773. {
  1774. in.flags = 0;
  1775. }
  1776.     /* Set the input structure */
  1777.     if (pFileDesc->filename == NULL)
  1778.         {
  1779.         free (pOut);
  1780.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, NULL);
  1781.         }
  1782.     /* allocate room for the file name string */
  1783.     fileNameLen = strlen (pFileDesc->filename) + 1;
  1784.     if ( (in.fileDesc.filename = (char *) malloc (fileNameLen)) == NULL)
  1785. {
  1786. free (pOut);
  1787. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1788. }
  1789.     strcpy (in.fileDesc.filename, pFileDesc->filename);
  1790.     if (pFileDesc->nSections != 0)
  1791.         {
  1792.         in.fileDesc.section = (LD_M_SECTION *) calloc (1, 
  1793. pFileDesc->nSections * sizeof (LD_M_SECTION));
  1794.         if (in.fileDesc.section == NULL)
  1795.             {
  1796.             free (pOut);
  1797.             free (in.fileDesc.filename);
  1798.             WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1799.             }
  1800. for (scnIdx = 0; scnIdx < pFileDesc->nSections; scnIdx++)
  1801.     in.fileDesc.section [scnIdx].addr =
  1802. pFileDesc->section [scnIdx].addr;
  1803.         }
  1804.     else
  1805.         in.fileDesc.section = NULL;
  1806.     memset ((void *) &in.fileDesc.undefSymList, 0, sizeof (WTX_SYM_LIST));
  1807.     in.wtxCore.errCode = 0;
  1808.     in.wtxCore.protVersion = 0;
  1809.     in.fileDesc.moduleId = 0;
  1810.     in.fileDesc.loadFlag = pFileDesc->loadFlag;
  1811.     in.fileDesc.nSections = pFileDesc->nSections;
  1812.     in.numPacket = 0;
  1813.     /* The file must be opened by the target server */
  1814.     if ((pFileDesc->moduleId & WTX_LOAD_FROM_TARGET_SERVER) ||
  1815. ((pFileDesc->loadFlag & LOAD_MODULE_INFO_ONLY) 
  1816. == LOAD_MODULE_INFO_ONLY))
  1817.         {
  1818.         in.buffer = NULL;
  1819.         in.numItems = 0;
  1820.         in.fileSize = 0;
  1821.         in.numPacket = 0;
  1822.         callStat = exchange (hWtx, WTX_OBJ_MODULE_LOAD_2, &in, pOut);
  1823.         if (callStat != WTX_ERR_NONE)
  1824.             {
  1825.             free (pOut);
  1826.             free (in.fileDesc.filename);
  1827.             if (in.fileDesc.section != NULL)
  1828.                 free (in.fileDesc.section);
  1829.             WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1830.             }
  1831.         free (in.fileDesc.filename);
  1832.         if (in.fileDesc.section != NULL)
  1833.             free (in.fileDesc.section);
  1834.         /* Output parameter */
  1835. if (wtxFreeAdd (hWtx, (void *) ((int) pOut + OFFSET (WTX_MSG_DUMMY,
  1836.      field)),
  1837. NULL, pOut, WTX_OBJ_MODULE_LOAD_2, hWtx->server,
  1838. WTX_SVR_SERVER) != WTX_OK)
  1839.     {
  1840.     WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1841.     }
  1842.         return ((WTX_LD_M_FILE_DESC *) ((int) pOut + 
  1843. OFFSET (WTX_MSG_DUMMY, field)));
  1844.         }
  1845.     /* Open object module file */
  1846. #ifdef HOST
  1847. #ifdef WIN32
  1848.     if((fd = open (pFileDesc->filename, O_RDONLY | _O_BINARY, 0)) == ERROR)
  1849. #else /* WIN32 */
  1850.     if((fd = open (pFileDesc->filename, O_RDONLY , 0)) == ERROR)
  1851. #endif /* WIN32 */
  1852.         {
  1853.         free (pOut);
  1854.         free (in.fileDesc.filename);
  1855.         if (in.fileDesc.section != NULL)
  1856.             free (in.fileDesc.section);
  1857.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_FILE_NOT_ACCESSIBLE, NULL);
  1858.         }
  1859.     /* Bind the path to the file descriptor */
  1860.     if (pathFdBind (fd, pFileDesc->filename) == ERROR)
  1861.         {
  1862.         close (fd);
  1863.         free (pOut);
  1864.         free (in.fileDesc.filename);
  1865.         if (in.fileDesc.section != NULL)
  1866.             free (in.fileDesc.section);
  1867.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_FILE_NOT_FOUND, NULL);
  1868.         }
  1869.     /* Get the object file size */
  1870. #ifndef WIN32
  1871.     if (fstat (fd, &infoFile) != OK)
  1872. #else
  1873.     if (_fstat (fd, &infoFile) != OK)
  1874. #endif /* WIN32 */
  1875.         {
  1876.         close (fd);
  1877.         free (pOut);
  1878.         free (in.fileDesc.filename);
  1879.         if (in.fileDesc.section != NULL)
  1880.             free (in.fileDesc.section);
  1881.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_FILE_NOT_ACCESSIBLE, NULL);
  1882.         }
  1883.     fileSize = (int) infoFile.st_size;
  1884.     if (fileSize == 0)
  1885.         {
  1886.         close (fd);
  1887.         free (pOut);
  1888.         free (in.fileDesc.filename);
  1889.         if (in.fileDesc.section != NULL)
  1890.             free (in.fileDesc.section);
  1891.         WTX_ERROR_RETURN (hWtx, WTX_ERR_API_NULL_SIZE_FILE, NULL);
  1892.         }
  1893.     /* Set the input structure */
  1894.     in.fileSize = fileSize;
  1895.     do
  1896.         {
  1897.         /* Malloc on buf to store a part of the file */
  1898.         buf = (char *) calloc (WTX_FILE_SLICE_SIZE, sizeof(char));
  1899.         if (buf == NULL)
  1900.             {
  1901.             free (pOut);
  1902.             free (in.fileDesc.filename);
  1903.             if (in.fileDesc.section != NULL)
  1904.                 free (in.fileDesc.section);
  1905.             WTX_ERROR_RETURN (hWtx, WTX_ERR_API_MEMALLOC, NULL);
  1906.             }
  1907.         /* The object file is read and stored in the host memory */
  1908.         nBytes = read (fd, buf, WTX_FILE_SLICE_SIZE);
  1909.         if (nBytes == ERROR)
  1910.             {
  1911.             free (pOut);
  1912.             free (in.fileDesc.filename);
  1913.             if (in.fileDesc.section != NULL)
  1914.                 free (in.fileDesc.section);
  1915.             free (buf);
  1916.             WTX_ERROR_RETURN (hWtx, WTX_ERR_API_CANT_READ_FROM_FILE, NULL);
  1917.             }
  1918.         /* EOF reached: exit while loop */
  1919.         if (nBytes == 0)
  1920.             {
  1921.             free (buf);
  1922.             break;
  1923.             }
  1924.         in.numPacket++;
  1925.         in.numItems = nBytes;
  1926.         in.buffer = buf;
  1927.         callStat = exchange (hWtx, WTX_OBJ_MODULE_LOAD_2, &in, pOut);
  1928.         if (callStat != WTX_ERR_NONE)
  1929.             {
  1930.             free (buf);
  1931.             free (pOut);
  1932.             free (in.fileDesc.filename);
  1933.             if (in.fileDesc.section != NULL)
  1934.                 free (in.fileDesc.section);
  1935.             WTX_ERROR_RETURN (hWtx, callStat, NULL);
  1936.             }
  1937.         free (buf);
  1938.         /* One more time if more events to display */
  1939.         } while (nBytes != 0);
  1940.     /* Close the file */
  1941.     close (fd);
  1942.     free (in.fileDesc.filename);
  1943.     if (in.fileDesc.section != NULL)
  1944.         free (in.fileDesc.section);
  1945.     /* add pointer to the wtxResultFree () list */
  1946.     if (wtxFreeAdd (hWtx, (void *) ((int) pOut + OFFSET (WTX_MSG_DUMMY, field)),
  1947.     NULL, pOut, WTX_OBJ_MODULE_LOAD_2, hWtx->server,
  1948.     WTX_SVR_SERVER) != WTX_OK)
  1949. {
  1950. WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  1951. }
  1952. #endif /* HOST */
  1953.     /* Output parameter */
  1954.     return ((WTX_LD_M_FILE_DESC *) ((int) pOut + 
  1955.     OFFSET (WTX_MSG_DUMMY, field)));
  1956.     }
  1957. /*******************************************************************************
  1958. *
  1959. * wtxObjModuleLoadStart - Load a multiple section object file asynchronously
  1960. *
  1961. * This routine loads a module onto the target and into the target server 
  1962. * module table. It returns when the module is in the target server memory,
  1963. * ready to be relocated and downloaded by the target server loader. 
  1964. * The caller should pass in a pointer to a WTX_LD_M_FILE_DESC structure:
  1965. *
  1966. * EXPAND ../../../include/wtxmsg.h WTX_LD_M_FILE_DESC
  1967. *
  1968. * The user must set the `filename' field to the name of the file containing
  1969. * the object module and the `loadFlag' to the loader flags required:
  1970. * .iP LOAD_NO_SYMBOLS 12
  1971. * No symbols are added to the system symbol table
  1972. * .iP LOAD_LOCAL_SYMBOLS
  1973. * Only local symbols are added to the system symbol table
  1974. * .iP LOAD_GLOBAL_SYMBOLS
  1975. * Only external symbols are added to the system symbol table
  1976. * .iP LOAD_ALL_SYMBOLS
  1977. * All symbols are added to the system symbol table
  1978. * .iP LOAD_FULLY_LINKED
  1979. * No relocation is required
  1980. * .iP LOAD_NO_DOWNLOAD
  1981. * The module is not loaded on the target
  1982. * .iP LOAD_HIDDEN_MODULE
  1983. * Load the module but make it invisible to WTX_MSG_MODULE_LIST
  1984. * .iP LOAD_COMMON_MATCH_NONE
  1985. * Allocate common symbols, but do not search for any matching symbols (the
  1986. * default)
  1987. * .iP LOAD_COMMON_MATCH_USER
  1988. * Allocate common symbols, but search for matching symbols in user-loaded
  1989. * modules
  1990. * .iP LOAD_COMMON_MATCH_ALL
  1991. * Allocate common symbols, but search for matching symbols in user-loaded
  1992. * modules and the target-system core file
  1993. * .iP LOAD_BAL_OPTIM
  1994. * Use branch-and-link optimization (for i960 targets only)
  1995. * .iP LOAD_CPLUS_XTOR_AUTO
  1996. * C++ ctors/dtors management is explicitly turned on
  1997. * .iP LOAD_CPLUS_XTOR_MANUAL
  1998. * C++ ctors/dtors management is explicitly turned off
  1999. * .iP LOAD_MODULE_INFO_ONLY
  2000. * Create and initialize a module, do not load a file
  2001. * .LP
  2002. *
  2003. * When no section description is given and `nSections' is set to zero, the 
  2004. * host-based loader allocates memory for the text, data and bss sections of 
  2005. * the module using memory from the target memory pool. If the `nSections' 
  2006. * field is non-zero, the user can specify the location to load the sections 
  2007. * and the `section' field points to an array of section descriptors:
  2008. *
  2009. * EXPAND ../../../include/wtxmsg.h LD_M_SECTION
  2010. *
  2011. * NOTE: COFF object modules with more than 3 sections are not supported.
  2012. *
  2013. * NOTE: Because this routine returns only WTX_OK or WTX_ERROR, the user
  2014. * must call wtxObjModuleLoadProgressReport() in order to have the module Id,
  2015. * sections addresses and the undefined symbols.
  2016. *
  2017. * Files loaded on the target by the target server can be opened either by
  2018. * the target server or by the client. These two behaviors can be controled by
  2019. * <moduleId>: "WTX_LOAD_FROM_CLIENT" opens the file where the client is, 
  2020. * "WTX_LOAD_FROM_TARGET_SERVER" opens the file where the target server is.
  2021. *
  2022. * EXAMPLE:
  2023. * Load a module on the target, the file is opened either by the client or by
  2024. * the target server according to the place where the file is.
  2025. *
  2026. * .CS
  2027. *   ...
  2028. *
  2029. *   pFileDescIn->filename  = "/folk/pascal/Board/ads860/objSampleWtxtclTest2.o";
  2030. *   pFileDescIn->loadFlag  = LOAD_GLOBAL_SYMBOLS;
  2031. *   pFileDescIn->nSections = 0;
  2032. *   pFileDescIn->moduleId  = WTX_LOAD_FROM_CLIENT;
  2033. *
  2034. *   /@ Open the file locally @/
  2035. *
  2036. *   if (isTgtSvrLocal)
  2037. * {
  2038. *       if(wtxObjModuleLoadStart (wtxh, pFileDescIn) == WTX_ERROR)
  2039. *     return (WTX_ERROR);
  2040. * else
  2041. *     {
  2042. *     /@ Load is in progress: get its status @/
  2043. *
  2044. *     if ((pLoadReport = wtxObjModuleLoadProgressReport (wtxh)) == NULL)
  2045. *         return (WTX_ERROR);
  2046. *
  2047. *           /@ Do something @/
  2048. *
  2049. *     ... 
  2050. *           }
  2051. *       }
  2052. *    else /@ The target server opens the file @/
  2053. *       {
  2054. *       pFileDescIn->moduleId = WTX_LOAD_FROM_TARGET_SERVER;
  2055. *
  2056. *       if(wtxObjModuleLoadStart (wtxh, pFileDescIn) == WTX_ERROR)
  2057. *           return (WTX_ERROR);
  2058. *       else
  2059. *           {
  2060. *     /@ Load is in progress: get its status @/
  2061. *
  2062. *     if ((pLoadReport = wtxObjModuleLoadProgressReport (wtxh)) == NULL)
  2063. *         return (WTX_ERROR);
  2064. *
  2065. *           /@ Do something @/
  2066. *
  2067. *     ...
  2068. *           }
  2069. *       }
  2070. *   ...
  2071. * .CE
  2072. *
  2073. * RETURNS: WTX_OK or WTX_ERROR if something failed
  2074. *
  2075. * ERRORS:
  2076. * .iP WTX_ERR_API_MEMALLOC 12
  2077. * A buffer cannot be allocated
  2078. * .iP WTX_ERR_API_INVALID_ARG
  2079. * filename is NULL
  2080. * .iP WTX_ERR_API_FILE_NOT_ACCESSIBLE
  2081. * filename doesn't exist or bad permission
  2082. * .iP WTX_ERR_API_FILE_NOT_FOUND
  2083. * Cant bind the path name to the file descriptor
  2084. * .iP WTX_ERR_API_NULL_SIZE_FILE
  2085. * File have a null size
  2086. * .iP WTX_ERR_API_CANT_READ_FROM_FILE
  2087. * Read in file failed
  2088. * .iP WTX_ERR_SVR_EINVAL
  2089. * Request issued out of sequence. A tool should not submit a load request if
  2090. * it already has one pending.
  2091. * .iP WTX_ERR_SVR_NOT_ENOUGH_MEMORY
  2092. * Cannot allocate memory for internal needs
  2093. * .iP WTX_ERR_TGTMEM_NOT_ENOUGH_MEMORY
  2094. * Not enough memory in the target-server-managed target memory pool to store the
  2095. * object module segments.
  2096. * .iP WTX_ERR_LOADER_XXX
  2097. * See WTX_OBJ_MODULE_LOAD
  2098. *
  2099. * SEE ALSO: WTX_OBJ_MODULE_LOAD_2, wtxObjModuleLoad(), 
  2100. * wtxObjModuleLoadProgressReport(), wtxObjModuleLoadCancel(),
  2101. * .I API Reference Manual: Target Server Internal Routines,
  2102. * .I API Programmer's Guide: Object Module Loader
  2103. */
  2104. STATUS wtxObjModuleLoadStart
  2105.     (
  2106.     HWTX                        hWtx,           /* WTX API handle    */
  2107.     WTX_LD_M_FILE_DESC *        pFileDesc       /* Module descriptor */
  2108.     )
  2109.     {
  2110. #ifdef HOST
  2111.     WTX_LD_M_FILE_DESC * result;
  2112.     /* Keep only WTX_LOAD_FROM_XXX bits */
  2113.     pFileDesc->moduleId &= WTX_LOAD_FROM_TARGET_SERVER;
  2114.     /* module info request will be reported synchronously */
  2115.     if (pFileDesc->loadFlag & LOAD_MODULE_INFO_ONLY)
  2116. pFileDesc->moduleId &= (~WTX_LOAD_ASYNCHRONOUSLY);
  2117.     else
  2118. pFileDesc->moduleId |= WTX_LOAD_ASYNCHRONOUSLY;
  2119.     internalLoadCall = TRUE;
  2120.     result = wtxObjModuleLoad (hWtx, pFileDesc);
  2121.     if (result == NULL)
  2122. return (WTX_ERROR);
  2123.     /* Free allocated memory */
  2124.     wtxResultFree (hWtx, result);
  2125. #endif /* HOST */
  2126.     return (WTX_OK);
  2127.     }
  2128. /*******************************************************************************
  2129. *
  2130. * wtxObjModuleLoadProgressReport - get the asynchronous load status
  2131. *
  2132. * This routine returns the current load context after a wtxObjModuleLoadStart
  2133. * request.
  2134. *
  2135. * EXPAND ../../../include/wtx.h WTX_LOAD_REPORT_INFO
  2136. *
  2137. * Use free() to free the output WTX_LOAD_REPORT_INFO parameter, and when
  2138. * the load is complete, use wtxSymListFree() to free the undefined symbols
  2139. * list if it exists, free also <filename> and <section>.
  2140. *
  2141. * EXAMPLE:
  2142. * Load a module on the target and each second, the load status is evaluated.
  2143. *
  2144. * .CS
  2145. *   ...
  2146. *
  2147. *   pFileDescIn->filename  = "/folk/pascal/Board/ads860/big.o";
  2148. *   pFileDescIn->loadFlag  = LOAD_GLOBAL_SYMBOLS;
  2149. *   pFileDescIn->nSections = 0;
  2150. *
  2151. *   /@ Load the module asynchronously @/
  2152. *
  2153. *   if (wtxObjModuleLoadStart (wtxh, pFileDescIn) == WTX_ERROR)
  2154. *       return (WTX_ERROR);
  2155. *
  2156. *   /@ Get info about the load @/
  2157. *
  2158. *   if ((pLoadReport = wtxObjModuleLoadProgressReport (wtxh)) == NULL)
  2159. *       return (WTX_ERROR)
  2160. *   else
  2161. *       {
  2162. *       /@ Define some shorthands @/
  2163. *
  2164. *       #define progress pLoadReport->STATE_INFO.PROGRESS_INFO
  2165. *       #define mod pLoadReport->STATE_INFO.WTX_LD_M_FILE_DESC
  2166. *
  2167. *       while (pLoadReport->loadState == LOAD_IN_PROGRESS)
  2168. *     {
  2169. *   #ifdef WIN32
  2170. *     Sleep (1000);
  2171. *   #else   
  2172. *     sleep (1);
  2173. *   #endif
  2174. *
  2175. *     /@ Print info about the load request @/
  2176. *
  2177. *     printf ("ttLOAD_IN_PROGRESS");
  2178. *     printf ("tPHASE: %dtdone: %dtremaining: %dn", 
  2179. *     progress.state, progress.currentValue, 
  2180. *     progress.maxValue - progress.currentValue);
  2181. *
  2182. *     free (pLoadReport);
  2183. *
  2184. *     if ((pLoadReport = wtxObjModuleLoadProgressReport (wtxh)) == NULL)
  2185. * {
  2186. * printf ("nwtxObjModuleProgressReport failedn");
  2187. * return (WTX_ERROR);
  2188. * }
  2189. *     }
  2190. *
  2191. * /@ The load is done: the module is on the target @/
  2192. *
  2193. * printf ("ttLOAD_DONEn");
  2194. *
  2195. *       /@ Do something @/
  2196. *
  2197. * ... 
  2198. *
  2199. * /@ First free any symbols list @/
  2200. *
  2201. * wtxSymListFree (&pLoadReport->undefSymList);
  2202. *
  2203. *       /@ Feeing dynamically allocated memory @/
  2204. *
  2205. * if (pLoadReport->filename != NULL)
  2206. *           free (pLoadReport->filename);
  2207. *
  2208. *       if (pLoadReport->section != NULL)
  2209. *           free (pLoadReport->section);
  2210. *
  2211. *       free (pLoadReport);
  2212. *
  2213. * ...
  2214. * .CE
  2215. *
  2216. * RETURNS: A pointer to a WTX_LOAD_REPORT_INFO for the load status or NULL on
  2217. * error.
  2218. *
  2219. * ERRORS:
  2220. * .iP WTX_ERR_API_MEMALLOC 12
  2221. * A buffer cannot be allocated
  2222. * .iP WTX_ERR_API_INVALID_ARG
  2223. * An invalid argument had been received
  2224. * .iP WTX_ERR_LOADER_LOAD_CANCELED
  2225. * The load had been aborted
  2226. * .iP WTX_ERR_LOADER_LOAD_IN_PROGRESS
  2227. * The load operation is not finished
  2228. * .iP WTX_ERR_LOADER_OBJ_MODULE_NOT_FOUND
  2229. * The module was unloaded by another client
  2230. * .iP WTX_ERR_SVR_EINVAL
  2231. * Request issued out of sequence. A tool should submit a load before issuing
  2232. * this request.
  2233. * .iP WTX_ERR_SVR_NOT_ENOUGH_MEMORY
  2234. * Cannot allocate memory for internal needs
  2235. * .iP WTX_ERR_TGTMEM_NOT_ENOUGH_MEMORY
  2236. * Not enough memory in the target-server-managed target memory pool to store the
  2237. * object module segments.
  2238. * .iP WTX_ERR_LOADER_XXX
  2239. * See WTX_OBJ_MODULE_LOAD
  2240. *
  2241. * SEE ALSO: WTX_OBJ_MODULE_LOAD_2, wtxObjModuleLoadStart(), 
  2242. * wtxObjModuleLoad(), wtxObjModuleLoadCancel(),
  2243. * .I API Reference Manual: Target Server Internal Routines,
  2244. * .I API Programmer's Guide: Object Module Loader
  2245. */
  2246. WTX_LOAD_REPORT_INFO * wtxObjModuleLoadProgressReport
  2247.     (
  2248.     HWTX                        hWtx             /* WTX API handle     */
  2249.     )
  2250.     {
  2251.     WTX_LOAD_REPORT_INFO *      pReportInfo = NULL; /* load progress info */
  2252. #ifdef HOST
  2253.     WTX_LD_M_FILE_DESC *        pFileDescIn = NULL; /* load action spec   */
  2254.     WTX_LD_M_FILE_DESC *        pFileDescOut = NULL; /* load result info   */
  2255.     UINT32                      index; /* index counter      */
  2256. #define progress pReportInfo->STATE_INFO.PROGRESS_INFO
  2257. #define mod pReportInfo->STATE_INFO.WTX_LD_M_FILE_DESC
  2258.     /* Allocate memory to store the input / output parameters */
  2259.     if ( (pReportInfo = (WTX_LOAD_REPORT_INFO *) 
  2260. calloc (1, sizeof (WTX_LOAD_REPORT_INFO))) == NULL)
  2261.         {
  2262.         wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2263.         goto error;
  2264.         }
  2265.     if ( (pFileDescIn = (WTX_LD_M_FILE_DESC *) 
  2266. calloc (1, sizeof (WTX_LD_M_FILE_DESC))) == NULL)
  2267.         {
  2268.         wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2269.         goto error;
  2270.         }
  2271.     /* Tell wtxObjModuleLoad() that we are in a PROGRESS_REPORT request */
  2272.     pFileDescIn->moduleId = WTX_LOAD_PROGRESS_REPORT;
  2273.     internalLoadCall = TRUE;
  2274.     /* Do the call */
  2275.     pFileDescOut = wtxObjModuleLoad (hWtx, pFileDescIn);
  2276.     /* Something failed during the call */
  2277.     if (pFileDescOut == NULL)
  2278. {
  2279.         goto error;
  2280. }
  2281.     /* We have an error, it's OK : this is the answer of PROGRESS_REPORT */
  2282.     if (wtxErrGet (hWtx) == WTX_ERR_LOADER_LOAD_IN_PROGRESS)
  2283. {
  2284. /* If we have more than 1 section, it's an error */
  2285. if (pFileDescOut->nSections != 1)
  2286.     {
  2287.             wtxErrSet (hWtx, WTX_ERR_API_INVALID_ARG);
  2288.             goto error;
  2289.     }
  2290. /* Save the progress report info values */
  2291. pReportInfo->loadState = LOAD_IN_PROGRESS;
  2292. progress.state         = pFileDescOut->section[0].flags;
  2293. progress.maxValue      = pFileDescOut->section[0].addr;
  2294. progress.currentValue  = pFileDescOut->section[0].length;
  2295. /* XXX - pai:
  2296.  * Note that if this mod is accepted, it changes the API
  2297.  * and breaks code which uses this routine as documented
  2298.  * in the comment header.  Expect runtime errors if the
  2299.  * following mod is compiled in.
  2300.  *
  2301.  * /@ add the pointer to the wtxResultFree() list @/
  2302.  *
  2303.  * if (wtxFreeAdd (hWtx, (void *) pReportInfo, (FUNCPTR) free, NULL, 0,
  2304.  * NULL, WTX_SVR_NONE) != WTX_OK)
  2305.  *   {
  2306.  *   WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2307.  *   }
  2308.  */
  2309. }
  2310.     else
  2311. {
  2312. /* Otherwise, the load is done */
  2313.         pReportInfo->loadState = LOAD_DONE;
  2314.         /* Copy the info from wtxObjModuleLoad */
  2315.         mod.loadFlag  = pFileDescOut->loadFlag;
  2316.         mod.moduleId  = pFileDescOut->moduleId;
  2317.         mod.nSections = pFileDescOut->nSections;
  2318.         /* Copy the file name */
  2319.         if ((mod.filename = calloc (strlen (pFileDescOut->filename) + 1, 1))
  2320.             == NULL)
  2321.             {
  2322.             wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2323.             goto error;
  2324.             }
  2325.         strcpy (mod.filename, pFileDescOut->filename);
  2326.         /* Copy the sections */
  2327.         if ((mod.section = calloc (mod.nSections * sizeof (LD_M_SECTION) , 1))
  2328.             == NULL)
  2329.             {
  2330.             wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2331.             goto error;
  2332.             }
  2333.         for (index = 0; index < mod.nSections; index++)
  2334.             {
  2335.             mod.section[index].flags  = pFileDescOut->section[index].flags;
  2336.             mod.section[index].addr   = pFileDescOut->section[index].addr;
  2337.             mod.section[index].length = pFileDescOut->section[index].length;
  2338.             }
  2339.  
  2340.         /* Copy the undefined symbols list */
  2341.         if (pFileDescOut->undefSymList.pSymbol != NULL)
  2342.             {
  2343.             WTX_SYMBOL * pSymbol; /* symbol in XDR list     */
  2344.             WTX_SYMBOL * pCurrent; /* newly allocated symbol */
  2345.             WTX_SYMBOL * pPrevious = NULL; /* previous symbol        */
  2346.             BOOL         firstSymbol = TRUE; /* first symbol in list ? */
  2347.             for (pSymbol = pFileDescOut->undefSymList.pSymbol; pSymbol;
  2348.                  pSymbol = (WTX_SYMBOL *) pSymbol->next)
  2349.                 {
  2350.                 if ((pCurrent = (WTX_SYMBOL *) calloc (1, sizeof (WTX_SYMBOL)))
  2351.                     == NULL)
  2352.                     {
  2353.                     wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2354.                     goto error;
  2355.                     }
  2356.                 memcpy ((void *) pCurrent, (void *) pSymbol, 
  2357.                         sizeof (WTX_SYMBOL));
  2358.                 if ((pCurrent->name = calloc (strlen (pSymbol->name) + 1, 
  2359.                     sizeof (char))) == NULL)
  2360.                     {
  2361.                     wtxErrSet (hWtx, WTX_ERR_API_MEMALLOC);
  2362.                     goto error;
  2363.                     }
  2364.                 strcpy (pCurrent->name, pSymbol->name);
  2365.                 pCurrent->next = NULL;
  2366.                 if (firstSymbol)
  2367.                     {
  2368.                     mod.undefSymList.pSymbol = pCurrent;
  2369.                     firstSymbol = FALSE;
  2370.                     }
  2371.                 else
  2372.                     pPrevious->next = pCurrent;
  2373.                 pPrevious = pCurrent;
  2374.                 }
  2375.             }
  2376. /* XXX - pai:
  2377.  * Note that if this mod is accepted, it changes the API
  2378.  * and breaks code which uses this routine as documented
  2379.  * in the comment header.  Expect runtime errors if the
  2380.  * following mod is compiled in.
  2381.  *
  2382.  * /@ add the pointer to the wtxResultFree() list @/
  2383.  *
  2384.  * if (wtxFreeAdd (hWtx, (void *) pReportInfo,
  2385.  *                (FUNCPTR) wtxObjModuleLoadProgressReportFree, NULL, 0,
  2386.  *                NULL, WTX_SVR_NONE) != WTX_OK)
  2387.  *     {
  2388.  *     WTX_ERROR_RETURN (hWtx, wtxErrGet (hWtx), NULL);
  2389.  *     }
  2390.  */
  2391.         }
  2392.     /* Free allocated memory */
  2393.     free (pFileDescIn);
  2394.     wtxResultFree (hWtx, pFileDescOut);
  2395. #endif /* HOST */
  2396.  
  2397.     /* Output parameter */
  2398.     return (pReportInfo);
  2399. #ifdef HOST
  2400. error:
  2401.     if (pFileDescIn != NULL)
  2402.         free (pFileDescIn);
  2403.     if (mod.filename != NULL)
  2404.         free (mod.filename);
  2405.     if (mod.section != NULL)
  2406.         free (mod.section);
  2407.     wtxSymListFree (&mod.undefSymList);
  2408.     if (pReportInfo != NULL)
  2409.         free (pReportInfo);
  2410.     
  2411.     wtxResultFree (hWtx, pFileDescOut);
  2412.     return (NULL);
  2413. #endif /* HOST */
  2414.     }
  2415. #if 0
  2416. /* XXX : fle : for SRP#67326 */
  2417. #ifdef HOST
  2418. /*******************************************************************************
  2419. *
  2420. * wtxObjModuleLoadProgressReportFree - free a load status report
  2421. *
  2422. * This routine is to free a load status report that is in the LOAD_DONE state.
  2423. * It is only applicable for LOAD_DONE states.
  2424. *
  2425. * RETURNS: WTX_OK or WTX_ERROR on failure
  2426. */
  2427. LOCAL STATUS wtxObjModuleLoadProgressReportFree
  2428.     (
  2429.     HWTX hWtx, /* WTX session handler */
  2430.     WTX_LOAD_REPORT_INFO * pToFree /* pointer to free     */
  2431.     )
  2432.     {
  2433.     STATUS status = WTX_ERROR; /* function status     */
  2434.     if ( (pToFree == NULL) || (pToFree->loadState != LOAD_DONE))
  2435. {
  2436. /* one of the given arguments is invalid */
  2437. wtxErrSet (hWtx, WTX_ERR_API_INVALID_ARG);
  2438. goto error;
  2439. }
  2440. #define desc pToFree->STATE_INFO.WTX_LD_M_FILE_DESC
  2441.     if (desc.filename !=NULL)
  2442. {
  2443. free (desc.filename);
  2444. }
  2445.     if (desc.section != NULL)
  2446. {
  2447. free (desc.section);
  2448. }
  2449.     if (&desc.undefSymList != NULL)
  2450. {
  2451. wtxSymListFree (&desc.undefSymList);
  2452. }
  2453.     free (pToFree);
  2454.     /* all the free operations went all right, exit with WTX_OK */
  2455.     status = WTX_OK;
  2456. error:
  2457.     return (status);
  2458.     }
  2459. #endif /* HOST */
  2460. #endif /* 0 */
  2461. /*******************************************************************************
  2462. *
  2463. * wtxObjModuleLoadCancel - Stop an asynchronous load request
  2464. *
  2465. * This routine stops an asynchronous load request. If the load had been
  2466. * already done or it can't be found, then it returns an error. 
  2467. *
  2468. * RETURNS: WTX_OK or WTX_ERROR on error.
  2469. *
  2470. * ERRORS:
  2471. * .iP WTX_ERR_SVR_INVALID_CLIENT_ID 12
  2472. * Tool not registered
  2473. * .iP WTX_ERR_SVR_EINVAL
  2474. * Request issued out of sequence. A tool should submit a load before issuing
  2475. * this request.
  2476. * .iP WTX_ERR_LOADER_ALREADY_LOADED
  2477. * The load is already finished
  2478. *
  2479. * SEE ALSO: WTX_COMMAND_SEND, wtxObjModuleLoadStart(), 
  2480. * wtxObjModuleLoadProgressReport(),
  2481. * .I API Reference Manual: Target Server Internal Routines,
  2482. * .I API Programmer's Guide: Object Module Loader
  2483. */
  2484. STATUS wtxObjModuleLoadCancel
  2485.     (
  2486.     HWTX                hWtx           /* WTX API handle   */
  2487.     )
  2488.     {
  2489. #ifdef HOST
  2490.     WTX_ERROR_T         callStat;      /* Exchange result  */
  2491.     WTX_MSG_PARAM       in;            /* Query parameters */
  2492.     WTX_MSG_RESULT      out;           /* Query result     */
  2493.     char                buf [32];      /* Input buffer     */
  2494.     /*
  2495.      * All API calls that require a connection to the target server
  2496.      * should use the WTX_CHECK_CONNECTED macro before doing anything else.
  2497.      * This macro also calls WTX_CHECK_HANDLE to validate the handle.
  2498.      */
  2499.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2500.     /* Set input - ouput parameters for WTX_COMMAND_SEND */
  2501.     in.param.valueType = V_PCHAR;
  2502.     strcpy (buf, WTX_LOAD_CANCEL_CMD);
  2503.     in.param.value_u.v_pchar = buf;
  2504.     memset (&out, 0, sizeof (out));
  2505.     /* Call WTX_COMMAND_SEND - wtxObjModuleLoadCancel service */
  2506.     callStat = exchange (hWtx, WTX_COMMAND_SEND, &in, &out);
  2507.     if (callStat != WTX_ERR_NONE)
  2508. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2509.     wtxExchangeFree (hWtx->server, WTX_COMMAND_SEND, &out);
  2510. #endif /* HOST */
  2511.     /* Tchao */
  2512.     return (WTX_OK);
  2513.     }
  2514. /******************************************************************************
  2515. *
  2516. * wtxObjModuleUndefSymAdd - add a undefined symbol to the undefined symbol list 
  2517. *
  2518. * This routine adds the symbol specified by <symId> to the corresponding
  2519. * module's undefined symbol list.
  2520. *
  2521. * RETURNS: WTX_OK or WTX_ERROR.
  2522. *
  2523. * SEE ALSO: WTX_OBJ_MODULE_UNDEF_SYM_ADD
  2524. * NOMANUAL
  2525. */
  2526. STATUS wtxObjModuleUndefSymAdd
  2527.     (
  2528.     HWTX hWtx, /* WTX API handle */
  2529.     char * symName, /* undefined symbol name */
  2530.     UINT32 symGroup /* undefined symbol group */
  2531.     )
  2532.     {
  2533.     WTX_ERROR_T         callStat;
  2534.     WTX_MSG_SYMBOL_DESC in;
  2535.     WTX_MSG_RESULT      out;
  2536.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2537.     memset (&in, 0, sizeof (in));
  2538.     memset (&out, 0, sizeof (out));
  2539.     in.symbol.name = symName;
  2540.     in.symbol.group = symGroup;
  2541.     callStat = exchange (hWtx, WTX_OBJ_MODULE_UNDEF_SYM_ADD, &in, &out);
  2542.     if (callStat != WTX_ERR_NONE)
  2543. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2544.     wtxExchangeFree (hWtx->server, WTX_OBJ_MODULE_UNDEF_SYM_ADD, &out);
  2545.     return (WTX_OK);
  2546.     }
  2547. /*******************************************************************************
  2548. *
  2549. * wtxObjModuleUnload - unload an object module from the target
  2550. *
  2551. * This routine unloads the module specified by <moduleId> from the target.
  2552. * The module ID is returned when the module is loaded or by one of the
  2553. * information routines.
  2554. *
  2555. * RETURNS: WTX_OK or WTX_ERROR.
  2556. *
  2557. * SEE ALSO: WTX_OBJ_MODULE_UNLOAD_2, wtxObjModuleLoad(), wtxObjModuleList(),
  2558. * wtxObjModuleInfoGet()
  2559. */
  2560. STATUS wtxObjModuleUnload
  2561.     (
  2562.     HWTX hWtx, /* WTX API handle */
  2563.     UINT32 moduleId /* id of module to unload */
  2564.     )
  2565.     {
  2566.     WTX_ERROR_T          callStat;
  2567.     WTX_MSG_MOD_NAME_OR_ID      in;
  2568.     WTX_MSG_RESULT       out;
  2569.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2570.     memset (&in, 0, sizeof (in));
  2571.     memset (&out, 0, sizeof (out));
  2572.     in.filename = NULL;
  2573.     in.moduleId = moduleId;
  2574.     callStat = exchange (hWtx, WTX_OBJ_MODULE_UNLOAD_2, &in, &out);
  2575.     if (callStat != WTX_ERR_NONE)
  2576.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2577.     wtxExchangeFree (hWtx->server, WTX_OBJ_MODULE_UNLOAD_2, &out);
  2578.     return (WTX_OK);
  2579.     }
  2580. /*******************************************************************************
  2581. *
  2582. * wtxObjModuleByNameUnload - unload an object module from the target
  2583. *
  2584. * This routine unloads the module specified by <name> from the target.
  2585. * The module ID is returned when the module is loaded or by one of the
  2586. * information routines.
  2587. *
  2588. * RETURNS: WTX_OK or WTX_ERROR if exchange failed.
  2589. *
  2590. * SEE ALSO: WTX_OBJ_MODULE_UNLOAD_2, wtxObjModuleUnload(), 
  2591. * wtxObjModuleLoad(), wtxObjModuleList(), wtxObjModuleInfoGet()
  2592. */
  2593. STATUS wtxObjModuleByNameUnload
  2594.     (
  2595.     HWTX        hWtx,                      /* WTX API handle             */
  2596.     char *      name                       /* Name of module to look for */
  2597.     )
  2598.     {
  2599.     WTX_ERROR_T                  callStat;
  2600.     WTX_MSG_MOD_NAME_OR_ID       in;
  2601.     WTX_MSG_RESULT               out;
  2602.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2603.     memset (&in, 0, sizeof (in));
  2604.     memset (&out, 0, sizeof (out));
  2605.     in.filename = name;
  2606.     in.moduleId = 0;
  2607.     callStat = exchange (hWtx, WTX_OBJ_MODULE_UNLOAD_2, &in, &out);
  2608.     if (callStat != WTX_ERR_NONE)
  2609.         WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2610.     wtxExchangeFree (hWtx->server, WTX_OBJ_MODULE_UNLOAD_2, &out);
  2611.     return (WTX_OK);
  2612.     }
  2613. /*******************************************************************************
  2614. *
  2615. * wtxRegisterForEvent - ask the WTX server to send events matching a regexp
  2616. *
  2617. * This routine takes a string <regExp>, which is a regular expression,
  2618. * and uses it to specify which events this user is interested in. By
  2619. * default a WTX client receives no event notifications.
  2620. *
  2621. * RETURNS: WTX_OK or WTX_ERROR.
  2622. *
  2623. * SEE ALSO: WTX_REGISTER_FOR_EVENT, wtxUnregisterForEvent(), 
  2624. * wtxEventGet(), wtxEventListGet()
  2625. */
  2626. STATUS wtxRegisterForEvent 
  2627.     (
  2628.     HWTX  hWtx, /* WTX API handle */
  2629.     const char * regExp /* Regular expression to select events */
  2630.     )
  2631.     {
  2632.     WTX_ERROR_T callStat;
  2633.     WTX_MSG_EVENT_REG_DESC in;
  2634.     WTX_MSG_RESULT out;
  2635.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2636.     memset (&out, 0, sizeof (out));
  2637.     memset (&in, 0, sizeof (in));
  2638.     in.evtRegExp = (char *) regExp;
  2639.     callStat = exchange (hWtx, WTX_REGISTER_FOR_EVENT, &in, &out);
  2640.     if (callStat != WTX_ERR_NONE)
  2641. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2642.     wtxExchangeFree (hWtx->server, WTX_REGISTER_FOR_EVENT, &out);
  2643.     return (WTX_OK);
  2644.     }
  2645. /*******************************************************************************
  2646. *
  2647. * wtxRegsGet - read register data from the target
  2648. *
  2649. * This routine reads <numBytes> of raw (target format) register data
  2650. * from the register set <regSet> starting from the byte at offset
  2651. * <firstByte>. The data read are stored in local memory at <regMemory>.
  2652. *
  2653. * The context types are given by:
  2654. *
  2655. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2656. *
  2657. * EXPAND ../../../include/wtxtypes.h WTX_REG_SET_TYPE
  2658. *
  2659. * RETURNS: WTX_OK or WTX_ERROR.
  2660. *
  2661. * SEE ALSO: WTX_REGS_GET, wtxRegsSet()
  2662. */
  2663. STATUS wtxRegsGet 
  2664.     (
  2665.     HWTX hWtx, /* WTX API handle */
  2666.     WTX_CONTEXT_TYPE contextType, /* context type to get regs of */
  2667.     WTX_CONTEXT_ID_T contextId, /* context id to get regs of */
  2668.     WTX_REG_SET_TYPE regSet, /* type of register set */
  2669.     UINT32 firstByte, /* first byte of register set */
  2670.     UINT32 numBytes, /* number of bytes of register set */
  2671.     void * regMemory /* place holder for reg. values */
  2672.     )
  2673.     {
  2674.     WTX_MSG_MEM_XFER_DESC out;
  2675.     WTX_MSG_REG_READ in;
  2676.     WTX_ERROR_T callStat;
  2677.     
  2678.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2679.     memset (&out, 0, sizeof (out));
  2680.     memset (&in, 0, sizeof (in));
  2681.     in.context.contextType = contextType;
  2682.     in.context.contextId = contextId;
  2683.     in.regSetType = regSet;
  2684.     in.memRegion.baseAddr = (TGT_ADDR_T) firstByte;
  2685.     in.memRegion.size = numBytes;
  2686.     /* NOTE: This relies on XDR to allocate memory to write register info to */
  2687.     callStat = exchange (hWtx, WTX_REGS_GET, &in, &out);
  2688.     if (callStat != WTX_ERR_NONE)
  2689. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2690.     /* WTX_REGS_GET is a pain because it may not set the error flag */
  2691.     if (out.memXfer.numBytes != numBytes)
  2692. {
  2693. wtxExchangeFree (hWtx->server, WTX_REGS_GET, &out);
  2694. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_REGS_GET_PARTIAL_READ, WTX_ERROR);
  2695. }
  2696.     memcpy(regMemory, out.memXfer.source, out.memXfer.numBytes);
  2697.     wtxExchangeFree (hWtx->server, WTX_REGS_GET, &out);
  2698.     return (WTX_OK);
  2699.     }
  2700. /*******************************************************************************
  2701. *
  2702. * wtxRegsSet - write to registers on the target
  2703. *
  2704. * This routine writes <numBytes> of raw (target format) register data
  2705. * to register set <regSet> starting at offset <firstByte>. Data is
  2706. * written from local memory at <regMemory>.
  2707. *
  2708. * The context types are given by:
  2709. *
  2710. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2711. *
  2712. * EXPAND ../../../include/wtxtypes.h WTX_REG_SET_TYPE
  2713. *
  2714. * RETURNS: WTX_OK or WTX_ERROR if the register set fails.
  2715. *
  2716. * SEE ALSO: WTX_REGS_SET
  2717. */
  2718. STATUS wtxRegsSet 
  2719.     (
  2720.     HWTX hWtx, /* WTX API handle */
  2721.     WTX_CONTEXT_TYPE contextType, /* context type to set regs of */
  2722.     WTX_CONTEXT_ID_T contextId, /* context id to set regs of */
  2723.     WTX_REG_SET_TYPE regSet, /* type of register set */
  2724.     UINT32 firstByte, /* first byte of reg. set */
  2725.     UINT32 numBytes, /* number of bytes in reg. set. */
  2726.     void * regMemory /* register contents */
  2727.     )
  2728.     {
  2729.     WTX_MSG_RESULT out;
  2730.     WTX_MSG_REG_WRITE in;
  2731.     WTX_ERROR_T callStat;
  2732.     
  2733.     WTX_CHECK_CONNECTED (hWtx, WTX_ERROR);
  2734.     memset (&out, 0, sizeof (out));
  2735.     memset (&in, 0, sizeof (in));
  2736.     in.context.contextId = contextId;
  2737.     in.context.contextType = contextType;
  2738.     in.regSetType = regSet;
  2739.     in.memXfer.destination = (TGT_ADDR_T) firstByte;
  2740.     in.memXfer.numBytes = numBytes;
  2741.     in.memXfer.source = (char *) regMemory;
  2742.   
  2743.     callStat = exchange (hWtx, WTX_REGS_SET, &in, &out);
  2744.     if (callStat != WTX_ERR_NONE)
  2745. WTX_ERROR_RETURN (hWtx, callStat, WTX_ERROR);
  2746.     wtxExchangeFree (hWtx->server, WTX_REGS_SET, &out);
  2747.     return (WTX_OK);
  2748.     }
  2749. /*******************************************************************************
  2750. *
  2751. * wtxStrToTgtAddr - convert a string argument to a TGT_ADDR_T value
  2752. *
  2753. * This routine takes a string and converts it to a TGT_ADDR_T.  The string
  2754. * is part of an event string.  See wtxEventGet() and the WTX library 
  2755. * discussion of WTX events in the f2API Reference Manual: WTX ProtocolfP.
  2756. * RETURNS: The address as a TGT_ADDR_T value.
  2757. */
  2758. TGT_ADDR_T wtxStrToTgtAddr 
  2759.     (
  2760.     HWTX hWtx, /* WTX API handle */
  2761.     const char *str /* string */
  2762.     )
  2763.     {
  2764.     WTX_CHECK_HANDLE (hWtx, 0);
  2765.     return (TGT_ADDR_T) strtoul (str, NULL, 16); /* Base 16 read */
  2766.     }
  2767. /*******************************************************************************
  2768. *
  2769. * wtxStrToContextId - convert a string argument to a WTX_CONTEXT_ID_T
  2770. *
  2771. * This routine takes a string and converts it to a context ID.  The string
  2772. * is part of an event string.  See wtxEventGet() and the WTX library 
  2773. * discussion of WTX events in the f2API Reference Manual: WTX ProtocolfP.
  2774. * RETURNS: The context ID.
  2775. */
  2776. WTX_CONTEXT_ID_T wtxStrToContextId 
  2777.     (
  2778.     HWTX hWtx, /* WTX API handle */
  2779.     const char *str /* string */
  2780.     )
  2781.     {
  2782.     WTX_CHECK_HANDLE (hWtx, 0);
  2783.     return (WTX_CONTEXT_ID_T) strtoul (str, NULL, 16); /* Hex read */
  2784.     }
  2785. /*******************************************************************************
  2786. *
  2787. * wtxStrToContextType - convert a string argument to a WTX_CONTEXT_TYPE value
  2788. *
  2789. * This routine takes a string and converts it to a WTX_CONTEXT_TYPE
  2790. * enumeration value.  The string is part of an event string.  See
  2791. * wtxEventGet() and the WTX library discussion of WTX events in the f2API
  2792. * Reference Manual: WTX ProtocolfP.
  2793. * The context types are given by:
  2794. *
  2795. * EXPAND ../../../include/wtxtypes.h WTX_CONTEXT_TYPE
  2796. *
  2797. * RETURNS: The context type or WTX_ERROR on error.
  2798. */
  2799. WTX_CONTEXT_TYPE wtxStrToContextType 
  2800.     (
  2801.     HWTX  hWtx, /* WTX API handle */
  2802.     const char * str /* string */
  2803.     )
  2804.     {
  2805.     INT32 value;
  2806.     WTX_CHECK_HANDLE (hWtx, WTX_ERROR);
  2807.     value = (INT32) strtol (str, NULL, 16); /* Hex read */
  2808.     
  2809.     if (value < WTX_CONTEXT_SYSTEM || value > WTX_CONTEXT_ISR_ANY)
  2810. WTX_ERROR_RETURN (hWtx, WTX_ERR_API_INVALID_ARG, WTX_ERROR);
  2811.     else
  2812. return (WTX_CONTEXT_TYPE) value;
  2813.     }
  2814. /*******************************************************************************
  2815. *
  2816. * wtxStrToInt32 - convert a string argument to an INT32 value
  2817. *
  2818. * This routine takes a string and converts it to a signed host integer.  The
  2819. * string is part of an event string.  See wtxEventGet() and the WTX library
  2820. * discussion of WTX events in the f2API Reference Manual: WTX ProtocolfP.
  2821. * RETURNS: The string as an INT32 value.
  2822. */
  2823. INT32 wtxStrToInt32 
  2824.     (
  2825.     HWTX hWtx, /* WTX API handle */
  2826.     const char *str /* string */
  2827.     )
  2828.     {
  2829.     return (INT32) strtol (str, NULL, 16); /* Base 16 read */
  2830.     }
  2831. /*******************************************************************************
  2832. *
  2833. * wtxStrToEventType - convert a string to a WTX event enumeration type
  2834. *
  2835. * This routine is a type converter for the event strings passed
  2836. * to a WTX client by the target server. It converts back to the
  2837. * event enumeration type so event types can be switched on.
  2838. *
  2839. * If the string is NULL, WTX_EVT_T_NONE is returned.  If
  2840. * the string does not match any of the pre-defined events,
  2841. * WTX_EVT_T_OTHER is returned.
  2842. *
  2843. * The event types are given by:
  2844. *
  2845. * EXPAND ../../../include/wtxtypes.h WTX_EVENT_TYPE
  2846. *
  2847. * RETURNS: The event type or WTX_EVT_T_INVALID on error.  
  2848. */
  2849. WTX_EVENT_TYPE wtxStrToEventType 
  2850.     (
  2851.     HWTX hWtx, /* WTX API handle */
  2852.     const char *str /* string */
  2853.     )
  2854.     {
  2855.     WTX_CHECK_HANDLE (hWtx, WTX_EVENT_INVALID);
  2856.     if (str == NULL)
  2857. return WTX_EVENT_NONE;
  2858.     else if (STREQ (str, WTX_EVT_TGT_RESET))
  2859. return WTX_EVENT_TGT_RESET;
  2860.     else if (STREQ (str, WTX_EVT_SYM_ADDED))
  2861. return WTX_EVENT_SYM_ADDED;
  2862.     else if (STREQ (str,WTX_EVT_SYM_REMOVED))
  2863. return WTX_EVENT_SYM_REMOVED;
  2864.     else if (STREQ (str,WTX_EVT_OBJ_LOADED))
  2865. return WTX_EVENT_OBJ_LOADED;
  2866.     else if (STREQ (str,WTX_EVT_OBJ_UNLOADED))
  2867. return WTX_EVENT_OBJ_UNLOADED;
  2868.     else if (STREQ (str,WTX_EVT_CTX_START))
  2869. return WTX_EVENT_CTX_START;
  2870.     else if (STREQ (str,WTX_EVT_CTX_EXIT))
  2871. return WTX_EVENT_CTX_EXIT;
  2872.     else if (STREQ (str,WTX_EVT_EXCEPTION))
  2873. return WTX_EVENT_EXCEPTION;
  2874.     else if (STREQ (str,WTX_EVT_VIO_WRITE))
  2875. return WTX_EVENT_VIO_WRITE;
  2876.     else if (STREQ (str,WTX_EVT_TOOL_ATTACH))
  2877. return WTX_EVENT_TOOL_ATTACH;
  2878.     else if (STREQ (str,WTX_EVT_TOOL_DETACH))
  2879. return WTX_EVENT_TOOL_DETACH;
  2880.     else if (STREQ (str,WTX_EVT_TOOL_MSG))
  2881. return WTX_EVENT_TOOL_MSG;
  2882.     else if (STREQ (str,WTX_EVT_TEXT_ACCESS))
  2883. return WTX_EVENT_TEXT_ACCESS;
  2884.     else if (STREQ (str,WTX_EVT_DATA_ACCESS))
  2885. return WTX_EVENT_DATA_ACCESS;
  2886.     else if (STREQ (str,WTX_EVT_CALL_RETURN))
  2887. return WTX_EVENT_CALL_RETURN;
  2888.     else if (STREQ (str,WTX_EVT_USER))
  2889. return WTX_EVENT_USER;
  2890.     else if (STREQ (str,WTX_EVT_TS_KILLED))
  2891. return WTX_EVENT_TS_KILLED;
  2892.     else if (STREQ (str,WTX_EVT_EVTPT_ADDED))
  2893. return WTX_EVENT_EVTPT_ADDED;
  2894.     else if (STREQ (str,WTX_EVT_EVTPT_DELETED))
  2895. return WTX_EVENT_EVTPT_DELETED;
  2896.     else if (STREQ (str,WTX_EVT_UNKNOWN))
  2897. return WTX_EVENT_UNKNOWN;
  2898.     else
  2899. return WTX_EVENT_OTHER;
  2900.     }
  2901. /*******************************************************************************
  2902. *
  2903. * wtxEventToStrType - convert a WTX event enumeration type to a string
  2904. *
  2905. * This routine is a string converter for the event type passed
  2906. * to the target server. It is the wtxStrToEventType routine counterpart.
  2907. *
  2908. * If the event is not known , the WTX_EVENT_UNKNOWN string is returned.
  2909. *
  2910. * The event types are given by:
  2911. *
  2912. * EXPAND ../../../include/wtxtypes.h WTX_EVENT_TYPE
  2913. *
  2914. * RETURNS: a string representing the event, or WTX_EVENT_UNKNOWN on error.
  2915. */
  2916.  
  2917. const char * wtxEventToStrType
  2918.     (
  2919.     WTX_EVENT_TYPE        event           /* WTX Event */
  2920.     )
  2921.     {
  2922.     switch (event)
  2923. {
  2924. case WTX_EVENT_TGT_RESET:
  2925.     return WTX_EVT_TGT_RESET;
  2926. case WTX_EVENT_SYM_ADDED:
  2927.     return WTX_EVT_SYM_ADDED;