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