xref: /linux/tools/testing/selftests/powerpc/copyloops/memmove_validate.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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 
8 void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
9 
10 #define BUF_LEN 65536
11 #define MAX_OFFSET 512
12 
13 size_t max(size_t a, size_t b)
14 {
15 	if (a >= b)
16 		return a;
17 	return b;
18 }
19 
20 static int testcase_run(void)
21 {
22 	size_t i, src_off, dst_off, len;
23 
24 	char *usermap = memalign(BUF_LEN, BUF_LEN);
25 	char *kernelmap = memalign(BUF_LEN, BUF_LEN);
26 
27 	assert(usermap != NULL);
28 	assert(kernelmap != NULL);
29 
30 	memset(usermap, 0, BUF_LEN);
31 	memset(kernelmap, 0, BUF_LEN);
32 
33 	for (i = 0; i < BUF_LEN; i++) {
34 		usermap[i] = i & 0xff;
35 		kernelmap[i] = i & 0xff;
36 	}
37 
38 	for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
39 		for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
40 			for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {
41 
42 				memmove(usermap + dst_off, usermap + src_off, len);
43 				TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
44 				if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
45 					printf("memmove failed at %ld %ld %ld\n",
46 							src_off, dst_off, len);
47 					abort();
48 				}
49 			}
50 		}
51 	}
52 	return 0;
53 }
54 
55 int main(void)
56 {
57 	return test_harness(testcase_run, "memmove");
58 }
59