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

VxWorks

开发平台:

C/C++

  1. /* wdbMemCoreLib.c - WDB memory services */
  2. /* Copyright 1984-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,05feb98,dbt  added wdbMemRead() and wdbMemProtect().
  7. 01d,02oct96,elp  added casts due to TGT_ADDR_T type change in wdb.h.
  8. 01c,29feb96,ms  fixed WDB_MEM_WRITE on a register (SPR 6092).
  9. 01b,22aug95,ms wdbMemTxtUpdate now returns OK if no run-time callout present
  10. 01a,19jun95,tpr written, inspired from wdbMemLib.c version 01d.
  11. */
  12. /*
  13. DESCPRIPTION
  14. This library contains the RPC routines to manipulate the targets memory.
  15. */
  16. #include "wdb/wdb.h"
  17. #include "wdb/wdbArchIfLib.h"
  18. #include "wdb/wdbRtIfLib.h"
  19. #include "wdb/wdbLib.h"
  20. #include "wdb/wdbSvcLib.h"
  21. #include "string.h"
  22. /* forward declarations */
  23. static UINT32 wdbMemWrite (WDB_MEM_XFER *  pMemXfer);
  24. static UINT32 wdbMemFill (WDB_MEM_REGION *pMemRegion);
  25. static UINT32 wdbMemChecksum (WDB_MEM_REGION *pMemRegion, UINT32 *cksum);
  26. static UINT32 wdbMemTxtUpdate (WDB_MEM_REGION *pMemRegion);
  27. static UINT32 wdbMemRead (WDB_MEM_REGION *pMemRegion,
  28. WDB_MEM_XFER *pMemXfer);
  29. static UINT32 wdbMemProtect (WDB_MEM_REGION *pMemRegion);
  30. /******************************************************************************
  31. *
  32. * wdbMemCoreLibInit - install the agent memory services.
  33. */
  34. void wdbMemCoreLibInit (void)
  35.     {
  36.     wdbSvcAdd (WDB_MEM_WRITE, wdbMemWrite,   xdr_WDB_MEM_XFER, xdr_void);
  37.     wdbSvcAdd (WDB_MEM_FILL, wdbMemFill,    xdr_WDB_MEM_REGION, xdr_void);
  38.     wdbSvcAdd (WDB_MEM_CHECKSUM, wdbMemChecksum, xdr_WDB_MEM_REGION,
  39.                  xdr_UINT32);
  40.     wdbSvcAdd (WDB_MEM_CACHE_TEXT_UPDATE,
  41. wdbMemTxtUpdate, xdr_WDB_MEM_REGION, xdr_void);
  42.     wdbSvcAdd (WDB_MEM_READ, wdbMemRead,    xdr_WDB_MEM_REGION,
  43. xdr_WDB_MEM_XFER);
  44.     wdbSvcAdd (WDB_MEM_PROTECT, wdbMemProtect, xdr_WDB_MEM_REGION, xdr_void);
  45.     }
  46. /******************************************************************************
  47. *
  48. * wdbMemTest - test memory for valid access.
  49. *
  50. * This test a range of addresses.
  51. */
  52. STATUS wdbMemTest
  53.     (
  54.     char * addr,
  55.     u_int nBytes,
  56.     u_int accessType /* VX_WRITE or VX_READ */
  57.     )
  58.     {
  59.     char        bb; /* bit bucket for memProbe() */
  60.     if (nBytes == 0)
  61. return (OK);
  62.     if (((*pWdbRtIf->memProbe) (addr, accessType, 1, &bb) != OK) ||
  63.         ((*pWdbRtIf->memProbe) (addr + nBytes - 1, accessType, 1, &bb)
  64.                         != OK))
  65. return (ERROR);
  66.     return (OK);
  67.     }
  68. /******************************************************************************
  69. *
  70. * wdbCksum - returns the ones compliment checksum of some memory.
  71. *
  72. * This routine is also used by the WDB UDP/IP module (which needs to do
  73. * a ~htons(wdbCksum())) to get it right).
  74. *
  75. * NOMANUAL
  76. */
  77. UINT32 wdbCksum
  78.     (
  79.     uint16_t * pAddr, /* start of buffer */
  80.     int  len /* size of buffer in bytes */
  81.     )
  82.     {
  83.     UINT32  sum = 0;
  84.     BOOL swap = FALSE;
  85.     /* take care of unaligned buffer address */
  86.     if ((UINT32)pAddr & 0x1)
  87. {
  88. sum += *((unsigned char *) pAddr) ++;
  89. len--;
  90. swap = TRUE;
  91. }
  92.     /* evaluate checksum */
  93.     while (len > 1)
  94. {
  95. sum += *(uint16_t *) pAddr ++;
  96. len -= 2;
  97. }
  98.     /* take care of last byte */
  99.     if (len > 0)
  100. sum = sum + ((*(unsigned char *) pAddr) << 8);
  101.     /* fold to 16 bits */
  102.     sum = (sum & 0xffff) + (sum >> 16);
  103.     sum = (sum & 0xffff) + (sum >> 16);
  104.     /* swap if we started on unaligned address */
  105.     if (swap)
  106. sum = ((sum & 0x00ff) << 8) | ((sum & 0xff00) >> 8);
  107.     return (sum);
  108.     }
  109. /******************************************************************************
  110. *
  111. * wdbMemWrite - write target memory.
  112. *
  113. * pMemRegion->param is unused.
  114. */
  115. static UINT32 wdbMemWrite
  116.     (
  117.     WDB_MEM_XFER * pMemXfer /* memory to transfer */
  118.     )
  119.     {
  120.     char *dest    = (char *)pMemXfer->destination;
  121.     int  numBytes = pMemXfer->numBytes;
  122.     if (((numBytes == 1) || (numBytes == 2) || (numBytes == 4)) &&
  123.         (((int)dest % numBytes) == 0))
  124.         {
  125.         if (pWdbRtIf->memProbe (dest, VX_WRITE, numBytes, pMemXfer->source) != OK)
  126.             return (WDB_ERR_MEM_ACCES);
  127.         return (OK);
  128.         }
  129.     if (wdbMemTest ((char *)pMemXfer->destination, pMemXfer->numBytes,
  130. VX_WRITE) != OK)
  131. return (WDB_ERR_MEM_ACCES);
  132.     bcopy (pMemXfer->source, (char *)pMemXfer->destination, pMemXfer->numBytes);
  133.     return (OK);
  134.     }
  135. /******************************************************************************
  136. *
  137. * wdbMemFill - fill target memory with some pattern.
  138. *
  139. * pMemRegion->param contains the fill pattern
  140. */
  141. static UINT32 wdbMemFill
  142.     (
  143.     WDB_MEM_REGION *  pMemRegion /* region to fill + pattern */
  144.     )
  145.     {
  146.     int  ix;
  147.     char * startAddr = (char *)pMemRegion->baseAddr;
  148.     u_int numBytes  = pMemRegion->numBytes;
  149.     UINT32 pattern   = ntohl (pMemRegion->param);
  150.     u_int nMisaligned;
  151.     if (wdbMemTest ((char *)pMemRegion->baseAddr, pMemRegion->numBytes,
  152. VX_WRITE) != OK)
  153. return (WDB_ERR_MEM_ACCES);
  154.     /* copy any misaligned bytes at the begining */
  155.     nMisaligned = (4 - ((u_int)startAddr & 0x3)) & 0x3;
  156.     if (nMisaligned > numBytes)
  157. nMisaligned = numBytes;
  158.     bcopy ((char *)&pattern, startAddr, nMisaligned);
  159.     startAddr += nMisaligned;
  160.     numBytes  -= nMisaligned;
  161.     pattern   =  ((pattern << (8 * nMisaligned)) |
  162.   (pattern >> (8 * (4 - nMisaligned))));
  163.     /* copy any misaligned bytes at the end */
  164.     nMisaligned = (numBytes & 0x3);
  165.     bcopy ((char *)&pattern, startAddr + numBytes - nMisaligned, nMisaligned);
  166.     numBytes    -= nMisaligned;
  167.     /* copy the bulk of the pattern 4 bytes at a time */
  168.     for (ix = 0; ix < numBytes; ix += 4)
  169. {
  170. *(UINT32 *)(startAddr + ix) = pattern;
  171. }
  172.     return (OK);
  173.     }
  174. /******************************************************************************
  175. *
  176. * wdbMemChecksum - checksum a block of memory.
  177. *
  178. * pMemRegion->param is unused.
  179. */
  180. static UINT32 wdbMemChecksum
  181.     (
  182.     WDB_MEM_REGION * pMemRegion, /* region to checksum */
  183.     UINT32 * val
  184.     )
  185.     {
  186.     if (wdbMemTest ((char *)pMemRegion->baseAddr, pMemRegion->numBytes,
  187. VX_READ) != OK)
  188. return (WDB_ERR_MEM_ACCES);
  189.     *val = ~wdbCksum ((uint16_t *)pMemRegion->baseAddr, pMemRegion->numBytes);
  190.     return (OK);
  191.     }
  192. /******************************************************************************
  193. *
  194. * wdbMemTxtUpdate - make data and instruction cache coherent after loading
  195. *     text to (data) memory.
  196. *
  197. * pMemRegion->param is unused.
  198. */
  199. static UINT32 wdbMemTxtUpdate
  200.     (
  201.     WDB_MEM_REGION *  pMemRegion /* region to do */
  202.     )
  203.     {
  204.     if (pWdbRtIf->cacheTextUpdate == NULL)
  205. return (OK);
  206.     if (wdbMemTest ((char *)pMemRegion->baseAddr, pMemRegion->numBytes,
  207.     VX_READ) != OK)
  208. return (WDB_ERR_MEM_ACCES);
  209.     (*pWdbRtIf->cacheTextUpdate) ((char *)pMemRegion->baseAddr,
  210. pMemRegion->numBytes);
  211.     return (OK);
  212.     }
  213. /******************************************************************************
  214. *
  215. * wdbMemRead - read target memory.
  216. *
  217. * pMemRegion->param is unused.
  218. */
  219. static UINT32 wdbMemRead
  220.     (
  221.     WDB_MEM_REGION * pMemRegion, /* region to read */
  222.     WDB_MEM_XFER * pMemXfer /* transfer data up to the host */
  223.     )
  224.     {
  225.     char *baseAddr = (char *)pMemRegion->baseAddr;
  226.     int  numBytes  = pMemRegion->numBytes;
  227.     static int buf;
  228.     if (((numBytes == 1) || (numBytes == 2) || (numBytes == 4)) &&
  229. (((int)baseAddr % numBytes) == 0))
  230. {
  231. if (pWdbRtIf->memProbe (baseAddr, VX_READ, numBytes, (char *)&buf)
  232. != OK)
  233.     return (WDB_ERR_MEM_ACCES);
  234. pMemXfer->source = (char *)&buf;
  235. pMemXfer->numBytes = numBytes;
  236. return (OK);
  237. }
  238.     if (wdbMemTest (baseAddr, numBytes, VX_READ) != OK)
  239. return (WDB_ERR_MEM_ACCES);
  240.     pMemXfer->source = baseAddr;
  241.     pMemXfer->numBytes = numBytes;
  242.     return (OK);
  243.     }
  244. /******************************************************************************
  245. *
  246. * wdbMemProtect - write (un)protect a region of memory.
  247. *
  248. * This routine modifies the write protection state of pMemRegion->numBytes
  249. * bytes of memory starting at pMemRegion->baseAddr.
  250. * If pMemRegion->param != 0, then the memory is write protected,
  251. * if pMemRegion->param == 0, then the memory is un-write-protected.
  252. *
  253. * RETURNS: OK on success,
  254. *    WDB_ERR_NO_RT_PROC if no runtime routine is installed, or
  255. *    WDB_ERR_MEM_ACCES if the runtime routine fails.
  256. */
  257. static UINT32 wdbMemProtect
  258.     (
  259.     WDB_MEM_REGION *  pMemRegion /* region to (un)protect */
  260.     )
  261.     {
  262.     if (pWdbRtIf->memProtect == NULL)
  263. return (WDB_ERR_NO_RT_PROC);
  264.     if ((*pWdbRtIf->memProtect)((char *)pMemRegion->baseAddr,
  265.  pMemRegion->numBytes,
  266.  pMemRegion->param) != OK)
  267. return (WDB_ERR_MEM_ACCES);
  268.     return (OK);
  269.     }