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

VxWorks

开发平台:

C/C++

  1. /* wdbMemLib.c - WDB memory services */
  2. /* Copyright 1984-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,05feb98,dbt  moved wdbMemRead and wdbMemProtect to wdbMemCoreLib.c (needed
  7.                  by dynamic scalable agent).
  8. 01g,02oct96,elp  added casts due to TGT_ADDR_T type change in wdb.h.
  9. 01f,29feb96,ms  fixed WDB_MEM_READ on a register (SPR 6092).
  10. 01e,19jun95,tpr divided in two files wdbMemLib.c  and wdbMemCoreLib.c.
  11. 01d,07jun95,ms wdbMemScan sets WDB_ERR_NOT_FOUND instead of returning -1
  12. 01c,14mar95,p_m fixed checksum calculation according to RFC 1071.
  13. 01b,01mar95,ms changed chksum, added memMove and cacheUpdate.
  14. 01a,21sep94,ms  written.
  15. */
  16. /*
  17. DESCPRIPTION
  18. This library contains the RPC routines to manipulate the targets memory.
  19. */
  20. #include "wdb/wdb.h"
  21. #include "wdb/wdbArchIfLib.h"
  22. #include "wdb/wdbRtIfLib.h"
  23. #include "wdb/wdbLib.h"
  24. #include "wdb/wdbSvcLib.h"
  25. #include "string.h"
  26. extern STATUS wdbMemTest (char * addr, u_int nBytes, u_int accessType);
  27. /* forward declarations */
  28. static UINT32 wdbMemMove (WDB_MEM_REGION *pMemRegion);
  29. static UINT32 wdbMemScan (WDB_MEM_SCAN_DESC *pMemScan, TGT_ADDR_T *val);
  30. /******************************************************************************
  31. *
  32. * wdbMemLibInit - install the agent memory services.
  33. */
  34. void wdbMemLibInit (void)
  35.     {
  36.     wdbSvcAdd (WDB_MEM_MOVE, wdbMemMove,    xdr_WDB_MEM_REGION, xdr_void);
  37.     wdbSvcAdd (WDB_MEM_SCAN, wdbMemScan, xdr_WDB_MEM_SCAN_DESC,
  38. xdr_TGT_ADDR_T);
  39.     }
  40. /******************************************************************************
  41. *
  42. * wdbMemMove - move a block of target memory.
  43. *
  44. * pMemRegion->param contains the destination address.
  45. */
  46. static UINT32 wdbMemMove
  47.     (
  48.     WDB_MEM_REGION *  pMemRegion /* region of memory to move */
  49.     )
  50.     {
  51.     char bb; /* for memProbe() */
  52.     if (wdbMemTest ((char *)pMemRegion->baseAddr, pMemRegion->numBytes,
  53. VX_READ) != OK)
  54. goto error;
  55.     if (pMemRegion->numBytes == 0)
  56. return (OK);
  57.     /* 
  58.      * Normally source and destination blocks don't overlap, so we
  59.      * can just probe the destination for VX_WRITE to see if it is safe.
  60.      * If they overlap, the we have to make sure that the probe character
  61.      * written is the same as what is already there (else we'd mess up the
  62.      * source block).
  63.      */
  64.     if ((pMemRegion->param > (UINT32)pMemRegion->baseAddr) &&
  65. (pMemRegion->param < 
  66. (UINT32)pMemRegion->baseAddr + pMemRegion->numBytes))
  67. bb = *(char *)(pMemRegion->param);
  68.     if ((*pWdbRtIf->memProbe) ((char *)pMemRegion->param, VX_WRITE,
  69. 1, &bb) != OK)
  70. goto error;
  71.     if ((pMemRegion->param + pMemRegion->numBytes >
  72. (UINT32)pMemRegion->baseAddr) &&
  73. (pMemRegion->param + pMemRegion->numBytes <
  74. (UINT32)pMemRegion->baseAddr + pMemRegion->numBytes))
  75. bb = *(char *)(pMemRegion->param + pMemRegion->numBytes - 1);
  76.     if ((*pWdbRtIf->memProbe) ((char *)pMemRegion->param + pMemRegion->numBytes
  77. - 1, VX_WRITE, 1, &bb) != OK)
  78. goto error;
  79.     memmove ((char *)pMemRegion->param, (char *)pMemRegion->baseAddr,
  80. pMemRegion->numBytes);
  81.     return (OK);
  82. error:
  83.     return (WDB_ERR_MEM_ACCES);
  84.     }
  85. /******************************************************************************
  86. *
  87. * wdbMemScan - scan memory for a pattern
  88. *
  89. * if (pMemScan->memXfer.numBytes > 0) search forwards. Otherwise
  90. * a backwards search is performed.
  91. *
  92. * if (pMemScan->memRegion.param == 0), we search for the pattern
  93. * pMemScan->memXfer.source. Otherwise we search until we don't match
  94. * the pattern.
  95. *
  96. * On return, val is set to the address on which the match was found.
  97. *
  98. * RETURNS: OK, WDB_ERR_MEM_ACCES, or WDB_ERR_NOT_FOUND
  99. */ 
  100. static UINT32 wdbMemScan
  101.     (
  102.     WDB_MEM_SCAN_DESC * pMemScan,
  103.     TGT_ADDR_T * val
  104.     )
  105.     {
  106.     char * pattern = pMemScan->memXfer.source;
  107.     int    size = pMemScan->memXfer.numBytes;
  108.     char * start; /* first address to check */
  109.     char * end; /* last address to check */
  110.     char * addr; /* current address to check */
  111.     int step; /* address increment */
  112.     if (wdbMemTest ((char *)pMemScan->memRegion.baseAddr,
  113.     pMemScan->memRegion.numBytes, VX_READ) != OK)
  114.         return (WDB_ERR_MEM_ACCES);
  115.     if (pMemScan->memRegion.numBytes > 0)
  116. {
  117. start = (char *)pMemScan->memRegion.baseAddr;
  118. end = start + pMemScan->memRegion.numBytes - size + 1;
  119. step = 1;
  120. if (start > end)
  121.     return (WDB_ERR_NOT_FOUND);
  122. }
  123.     else
  124. {
  125. start = (char *)pMemScan->memRegion.baseAddr - size;
  126. end = start + pMemScan->memRegion.numBytes - 1;
  127. step = -1;
  128. if (start < end)
  129.     return (WDB_ERR_NOT_FOUND);
  130. }
  131.     /* scan for a match */
  132.     if (pMemScan->memRegion.param == 0)
  133. {
  134. for (addr = start; addr != end; addr += step)
  135.     {
  136.     if (memcmp (addr, pattern, size) == 0)
  137. {
  138. *val = (TGT_ADDR_T)addr;
  139. return (OK);
  140. }
  141.     }
  142. }
  143.     /* scan for a mismatch */
  144.     else
  145. {
  146. for (addr = start; addr != end; addr += step)
  147.     {
  148.     if (memcmp (addr, pattern, size) != 0)
  149. {
  150. *val = (TGT_ADDR_T)addr;
  151. return (OK);
  152. }
  153.     }
  154. }
  155.     return (WDB_ERR_NOT_FOUND);
  156.     }