memmove_validate.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <assert.h>
  6. #include "utils.h"
  7. void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
  8. #define BUF_LEN 65536
  9. #define MAX_OFFSET 512
  10. size_t max(size_t a, size_t b)
  11. {
  12. if (a >= b)
  13. return a;
  14. return b;
  15. }
  16. static int testcase_run(void)
  17. {
  18. size_t i, src_off, dst_off, len;
  19. char *usermap = memalign(BUF_LEN, BUF_LEN);
  20. char *kernelmap = memalign(BUF_LEN, BUF_LEN);
  21. assert(usermap != NULL);
  22. assert(kernelmap != NULL);
  23. memset(usermap, 0, BUF_LEN);
  24. memset(kernelmap, 0, BUF_LEN);
  25. for (i = 0; i < BUF_LEN; i++) {
  26. usermap[i] = i & 0xff;
  27. kernelmap[i] = i & 0xff;
  28. }
  29. for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
  30. for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
  31. for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {
  32. memmove(usermap + dst_off, usermap + src_off, len);
  33. TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
  34. if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
  35. printf("memmove failed at %ld %ld %ld\n",
  36. src_off, dst_off, len);
  37. abort();
  38. }
  39. }
  40. }
  41. }
  42. return 0;
  43. }
  44. int main(void)
  45. {
  46. return test_harness(testcase_run, "memmove");
  47. }