0001
0002 #include <malloc.h>
0003 #include <stdlib.h>
0004 #include <string.h>
0005 #include <assert.h>
0006 #include "utils.h"
0007
0008 void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
0009
0010 #define BUF_LEN 65536
0011 #define MAX_OFFSET 512
0012
0013 size_t max(size_t a, size_t b)
0014 {
0015 if (a >= b)
0016 return a;
0017 return b;
0018 }
0019
0020 static int testcase_run(void)
0021 {
0022 size_t i, src_off, dst_off, len;
0023
0024 char *usermap = memalign(BUF_LEN, BUF_LEN);
0025 char *kernelmap = memalign(BUF_LEN, BUF_LEN);
0026
0027 assert(usermap != NULL);
0028 assert(kernelmap != NULL);
0029
0030 memset(usermap, 0, BUF_LEN);
0031 memset(kernelmap, 0, BUF_LEN);
0032
0033 for (i = 0; i < BUF_LEN; i++) {
0034 usermap[i] = i & 0xff;
0035 kernelmap[i] = i & 0xff;
0036 }
0037
0038 for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
0039 for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
0040 for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {
0041
0042 memmove(usermap + dst_off, usermap + src_off, len);
0043 TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
0044 if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
0045 printf("memmove failed at %ld %ld %ld\n",
0046 src_off, dst_off, len);
0047 abort();
0048 }
0049 }
0050 }
0051 }
0052 return 0;
0053 }
0054
0055 int main(void)
0056 {
0057 return test_harness(testcase_run, "memmove");
0058 }