memcpy.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #define _POSIX_C_SOURCE 200112L
  2. #define _GNU_SOURCE
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <stdint.h>
  7. #include <assert.h>
  8. #include <ctype.h>
  9. #include <time.h>
  10. #include <sched.h>
  11. #include <arpa/inet.h>
  12. #include <sys/time.h>
  13. #include "pci.h"
  14. #include "tools.h"
  15. #include "error.h"
  16. void *pcilib_memcpy8(void * dst, void const * src, size_t len) {
  17. int i;
  18. for (i = 0; i < len; i++) ((char*)dst)[i] = ((char*)src)[i];
  19. return dst;
  20. }
  21. void *pcilib_memcpy32(void * dst, void const * src, size_t len) {
  22. uint32_t * plDst = (uint32_t *) dst;
  23. uint32_t const * plSrc = (uint32_t const *) src;
  24. while (len >= 4) {
  25. // *plDst = ntohl(*plSrc);
  26. *plDst = *plSrc;
  27. plSrc++;
  28. plDst++;
  29. len -= 4;
  30. }
  31. char * pcDst = (char *) plDst;
  32. char const * pcSrc = (char const *) plSrc;
  33. while (len--) {
  34. *pcDst++ = *pcSrc++;
  35. }
  36. return (dst);
  37. }
  38. void *pcilib_memcpy64(void * dst, void const * src, size_t len) {
  39. uint64_t * plDst = (uint64_t *) dst;
  40. uint64_t const * plSrc = (uint64_t const *) src;
  41. while (len >= 8) {
  42. *plDst++ = *plSrc++;
  43. len -= 8;
  44. }
  45. char * pcDst = (char *) plDst;
  46. char const * pcSrc = (char const *) plSrc;
  47. while (len--) {
  48. *pcDst++ = *pcSrc++;
  49. }
  50. return (dst);
  51. }
  52. typedef void* (*pcilib_memcpy_routine_t)(void * dst, void const *src, size_t bytes);
  53. static pcilib_memcpy_routine_t pcilib_memcpy_routines[4] = {
  54. pcilib_memcpy8, NULL, pcilib_memcpy32, pcilib_memcpy64
  55. };
  56. void *pcilib_memcpy(void * dst, void const * src, uint8_t access, size_t n) {
  57. size_t pos = 0, size = n * access;
  58. pcilib_memcpy_routine_t routine;
  59. assert((access)&&(access <= 8));
  60. while (access >>= 1) ++pos;
  61. routine = pcilib_memcpy_routines[pos];
  62. return routine(dst, src, size);
  63. }